/*************************************************************************** * * File Name: HPPCFG.C * * Copyright (C) 1993-1996 Hewlett-Packard Company. * All rights reserved. * * 11311 Chinden Blvd. * Boise, Idaho 83714 * * This is a part of the HP JetAdmin Printer Utility * * This source code is only intended as a supplement for support and * localization of HP JetAdmin by 3rd party Operating System vendors. * Modification of source code cannot be made without the express written * consent of Hewlett-Packard. * * * Description: * * Author: Name * * * Modification history: * * date initials change description * * mm-dd-yy MJB * * * * * * ***************************************************************************/ #include #ifdef WIN32 #include #else #include #include #include #endif #include #include #include #include #include ".\resource.h" #include ".\uimain.h" #include ".\hppcfg.h" #include ".\prbitmap.h" #include ".\uimisc.h" #include ".\help\hpprntr.hh" // for help contexts //globals================================================== BOOL bEnergyStar = FALSE; HICON hLightIcons[3]; // stoplight icons HICON hModelIcon; // icon for the printer model UINT timerID; HPERIPHERAL hPeripheral = NULL; HWND hWnd = NULL; #ifdef WIN32 HIMAGELIST hImage = NULL; #endif int timerInt = 5000; DWORD deviceIDSave = PTR_UNDEF; #ifdef WIN32 int keywordIDListPrinter[] = { #else long keywordIDListPrinter[] = { #endif IDC_PRINTERBMP, IDH_RC_printer_graphical_status, IDC_STOPLIGHT, IDH_RC_printer_stoplight, IDC_STATUSMSG, IDH_RC_printer_status, IDC_STATUS_GROUP, IDH_RC_printer_status, IDC_FRONTPANEL, IDH_RC_printer_message, IDC_FPTITLE, IDH_RC_printer_message, IDC_MODEL, IDH_RC_printer_model, IDC_MODELBOX, IDH_RC_printer_model, IDC_MODELSTR, IDH_RC_printer_model, IDC_DESCRIPTION, IDH_RC_printer_description, IDC_DESCRIPTION_GROUP, IDH_RC_printer_description, IDC_CAPABILITIES, IDH_RC_printer_capabilities, IDC_CAPABILITIES_GROUP, IDH_RC_printer_capabilities, 0, 0, }; DWORD dwCurrentContext, dwCurrentStatus; DWORD oldDeviceBitmap, oldStatusBitmap; PeripheralDetails periphDetails; TCHAR currentHelpFile[32]; extern HINSTANCE hInstance; BOOL bProcessed = FALSE; //moved to global so Cls_OnCommand function has access //**************************************************************************** // Section that handles toolbar icons //**************************************************************************** static HICON hToolbarIcons[APPLET_MAX_TOOLBAR_BUTTONS]; //**************************************************************************** // Section that handles bitmap hotspot feedback //**************************************************************************** LPHOTSPOT lpHotspot = NULL; //========================================================= // Printer Sheet Dialog Proc DLL_EXPORT(BOOL) APIENTRY PrinterSheetProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam) { BOOL *pChanged = (BOOL *)lParam; bProcessed = FALSE; switch (msg) { #ifdef WIN32 case WM_HELP: return(OnF1HelpPrinter(wParam, lParam)); break; case WM_CONTEXTMENU: return(OnContextHelpPrinter(wParam, lParam)); break; case WM_NOTIFY: switch (((NMHDR FAR *)lParam)->code) { case PSN_HELP: WinHelp(hwnd, PRINTER_HELP_FILE, HELP_CONTEXT, IDH_PP_printer); break; case PSN_SETACTIVE: { if ( GetDlgItem(hWnd, IDC_FRONTPANEL) ) { UpdateStatus(); timerInt = GetRefreshRate(hPeripheral) * 1000; SetTimer(hwnd, 1, timerInt, NULL); } bProcessed = TRUE; SetWindowLong(hwnd, DWL_MSGRESULT, FALSE); } break; case PSN_KILLACTIVE: if ( GetDlgItem(hWnd, IDC_FRONTPANEL) ) KillTimer(hwnd, 1); bProcessed = TRUE; SetWindowLong(hwnd, DWL_MSGRESULT, FALSE); break; case PSN_APPLY: if ( GetDlgItem(hWnd, IDC_FRONTPANEL) ) KillTimer(hwnd, 1); bProcessed = TRUE; SetWindowLong(hwnd, DWL_MSGRESULT, PSNRET_NOERROR); break; case PSN_RESET: if ( GetDlgItem(hWnd, IDC_FRONTPANEL) ) KillTimer(hwnd, 1); break; default: break; } break; #else // TabSheet Specific Messages case TSN_ACTIVE: { if ( GetDlgItem(hWnd, IDC_FRONTPANEL) ) { UpdateStatus(); timerInt = GetRefreshRate(hPeripheral) * 1000; SetTimer(hwnd, 1, timerInt, NULL); } } break; case TSN_INACTIVE: *pChanged = TRUE; if ( GetDlgItem(hWnd, IDC_FRONTPANEL) ) KillTimer(hwnd, 1); return(TRUE); break; case TSN_OK: case TSN_APPLY_NOW: *pChanged = TRUE; break; case TSN_CANCEL: break; case TSN_HELP: WinHelp(hwnd, PRINTER_HELP_FILE, HELP_CONTEXT, IDH_PP_printer); break; #endif // WIN32 case WM_COMMAND: HANDLE_WM_COMMAND( hwnd, wParam, lParam, Cls_OnDeviceCommand); break; case WM_INITDIALOG: { HCURSOR hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); bProcessed = (BOOL)HANDLE_WM_INITDIALOG( hwnd, wParam, lParam, Cls_OnDeviceInitDialog); SetCursor(hCursor); } break; case WM_DRAWITEM: HANDLE_WM_DRAWITEM(hwnd, wParam, lParam, Cls_OnDeviceDrawItem); break; case WM_DESTROY: if ( GetDlgItem(hWnd, IDC_FRONTPANEL) ) KillTimer(hwnd, 1); DestroyIcon(hLightIcons[SEVERITY_RED]); DestroyIcon(hLightIcons[SEVERITY_YELLOW]); DestroyIcon(hLightIcons[SEVERITY_GREEN]); bProcessed = TRUE; if (lpHotspot != NULL) { HP_GLOBAL_FREE(lpHotspot); lpHotspot = NULL; } if (m_bToolbarSupported) { int i; for (i = 0; i < APPLET_MAX_TOOLBAR_BUTTONS; i++) { if (hToolbarIcons[i] != NULL) { DestroyIcon(hToolbarIcons[i]); } } } #ifdef WIN32 TreeView_SetImageList(GetDlgItem(hwnd, IDC_CAPABILITIES), NULL, 0); if ( hImage ) ImageList_Destroy(hImage); #endif break; case WM_TIMER: HANDLE_WM_TIMER(hwnd, wParam, lParam, Cls_OnDeviceTimer); bProcessed = TRUE; break; } return (bProcessed); } //--------------------------------------------------------- // message cracking macros //......................................................... void Cls_OnDeviceCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) //WM_COMMAND handler { switch (id) { case IDC_BUTTON1: case IDC_BUTTON2: case IDC_BUTTON3: case IDC_BUTTON4: case IDC_BUTTON5: case IDC_BUTTON6: case IDC_BUTTON7: { TCHAR szDeviceName[80]; DBGetNameEx(hPeripheral, NAME_DEVICE, szDeviceName); AMUIExtension(hPeripheral, hwnd, APPLET_UIEXT_TOOLBAR_COMMAND, (LPARAM)(id-IDC_BUTTON1), (LPARAM)0, APPLET_PRINTER, szDeviceName); break; } } } //......................................................... BOOL Cls_OnDeviceInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) //WM_INITDIALOG handler { TCHAR szDeviceName[80]; LPPROPSHEETPAGE psp = (LPPROPSHEETPAGE)lParam; //GetWindowLong(hwnd, GWL_USERDATA); hPeripheral = (HPERIPHERAL)psp->lParam; hWnd = hwnd; if ( GetDlgItem(hWnd, IDC_FRONTPANEL) ) { oldDeviceBitmap = 0; dwCurrentStatus = 0xffff; dwCurrentContext = 0; oldStatusBitmap = 0; DBGetNameEx(hPeripheral, NAME_DEVICE, szDeviceName); if (AMUIExtension(hPeripheral, hwnd, APPLET_UIEXT_HOTSPOTS_SUPPORTED, (LPARAM)0, (LPARAM)0, APPLET_PRINTER, szDeviceName) == RC_SUCCESS) { if ((lpHotspot = (LPHOTSPOT)HP_GLOBAL_ALLOC_DLL(sizeof(HOTSPOT))) != NULL) { if (AMUIExtension(hPeripheral, hwnd, APPLET_UIEXT_GET_HOTSPOT_REGIONS, (LPARAM)lpHotspot, (LPARAM)0, APPLET_PRINTER, szDeviceName) == RC_SUCCESS) { // fill out the structure lpHotspot->hWnd = hwnd; lpHotspot->hPeripheral = hPeripheral; _tcscpy(lpHotspot->szDeviceName, szDeviceName); } } } if (m_bToolbarSupported) { int i; HWND hwndChild; HICON hIcon; for (i = 0; i < APPLET_MAX_TOOLBAR_BUTTONS; i++) { if (hwndChild = GetDlgItem(hwnd, IDC_BUTTON1+i)) { if (AMUIExtension(hPeripheral, hwnd, APPLET_UIEXT_TOOLBAR_GET_ICON, (LPARAM)i, (LPARAM)&hIcon, APPLET_PRINTER, szDeviceName) != RC_SUCCESS) { hIcon = NULL; } else { ShowWindow(hwndChild, SW_SHOW); } hToolbarIcons[i] = hIcon; } } } } OnInitDialog(); return TRUE; } void DrawButtonItem(LPDRAWITEMSTRUCT lpDrawItem) { HDC hDC = lpDrawItem->hDC; HPEN hOldPen, hPenBlack = GetStockObject(BLACK_PEN), hPenHilite = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT)), hPenShadow = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); HBRUSH hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); LPRECT lpRect = &lpDrawItem->rcItem; POINT point[3]; HICON hIcon; // fill button background // FillRect(hDC, lpRect, hBrush); // draw button border // hOldPen = SelectObject(hDC, hPenBlack); point[0].x = lpRect->left+1; point[1].x = lpRect->right-1; point[0].y = point[1].y = lpRect->top; Polyline(hDC, point, 2); point[0].y = point[1].y = lpRect->bottom-1; Polyline(hDC, point, 2); point[0].y = lpRect->top+1; point[1].y = lpRect->bottom-1; point[0].x = point[1].x = lpRect->left; Polyline(hDC, point, 2); point[0].x = point[1].x = lpRect->right-1; Polyline(hDC, point, 2); InflateRect(lpRect, -1, -1); // draw 3d border // if (lpDrawItem->itemState & ODS_SELECTED) { SelectObject(hDC, hPenShadow); point[0].x = lpRect->left; point[0].y = lpRect->bottom-1; point[1].x = lpRect->left; point[1].y = lpRect->top; point[2].x = lpRect->right; point[2].y = lpRect->top; Polyline(hDC, point, 3); OffsetRect(lpRect, 1, 1); } else { SelectObject(hDC, hPenHilite); point[0].x = lpRect->left; point[0].y = lpRect->bottom-2; point[1].x = lpRect->left; point[1].y = lpRect->top; point[2].x = lpRect->right-1; point[2].y = lpRect->top; Polyline(hDC, point, 3); point[0].x++; point[0].y--; point[1].x++; point[1].y++; point[2].x--; point[2].y++; Polyline(hDC, point, 3); SelectObject(hDC, hPenShadow); point[0].x = lpRect->left; point[0].y = lpRect->bottom-1; point[1].x = lpRect->right-1; point[1].y = lpRect->bottom-1; point[2].x = lpRect->right-1; point[2].y = lpRect->top-1; Polyline(hDC, point, 3); point[0].x++; point[0].y--; point[1].x--; point[1].y--; point[2].x--; point[2].y++; Polyline(hDC, point, 3); } InflateRect(lpRect, -3, -3); // draw focus rectangle // if (lpDrawItem->itemState & ODS_FOCUS) { DrawFocusRect(hDC, lpRect); } InflateRect(lpRect, -2, -2); // Replace original pen so that we can delete these pens SelectObject(hDC, hOldPen); if (hPenHilite) DeleteObject(hPenHilite); if (hPenShadow) DeleteObject(hPenShadow); if (hBrush) DeleteObject(hBrush); if ((hIcon = hToolbarIcons[lpDrawItem->CtlID-IDC_BUTTON1]) != NULL) { DrawIcon(hDC, lpRect->left + ( ( lpRect->right - lpRect->left - 12 ) / 2 ), lpRect->top + ( ( lpRect->bottom - lpRect->top - 12 ) / 2 ), hIcon); } } //......................................................... void Cls_OnDeviceDrawItem(HWND hwnd, const DRAWITEMSTRUCT FAR* lpDrawItem) // handles WM_DRAWITEM { switch ( lpDrawItem->CtlID ) { case IDC_BUTTON1: case IDC_BUTTON2: case IDC_BUTTON3: case IDC_BUTTON4: case IDC_BUTTON5: case IDC_BUTTON6: case IDC_BUTTON7: DrawButtonItem((LPDRAWITEMSTRUCT)lpDrawItem); break; } } //......................................................... void Cls_OnDeviceTimer(HWND hwnd, UINT id) // handles WM_TIMER { if ( GetDlgItem(hWnd, IDC_FRONTPANEL) ) UpdateStatus(); } //--------------------------------------------------------- // // Printer Sheet helper functions // void OnOK(void) { } //......................................................... void OnHelp(void) { WinHelp(hWnd, PRINTER_HELP_FILE, HELP_CONTEXT, IDH_CONTENTS); } //......................................................... BOOL OnInitDialog(void) { PeripheralDesc desc; DWORD dWord; DWORD dwResult; DWORD cBufSize = 128; DWORD dwLevel = 0; BOOL bDoSettings = TRUE; HWND hDescription = GetDlgItem(hWnd, IDC_DESCRIPTION); HWND hModelWnd = GetDlgItem(hWnd, IDC_MODEL); PeripheralIcon periphIcon; timerInt = GetRefreshRate(hPeripheral) * 1000; dwResult = RC_FAILURE; dwCurrentStatus = 0xffff; dwCurrentContext = 0; // install correct stoplight here // load stoplight icons into icon array hLightIcons[SEVERITY_RED] = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_RED)); hLightIcons[SEVERITY_GREEN] = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_GREEN)); hLightIcons[SEVERITY_YELLOW] = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_YELLOW)); dWord = sizeof(PeripheralDetails); dwResult = PALGetObject(hPeripheral, OT_PERIPHERAL_DETAILS, 0, &periphDetails, &dWord); if (dwResult == RC_SUCCESS) deviceIDSave = periphDetails.deviceID; else LoadString(hInstance, IDS_UNKNOWN_PRINTER, periphDetails.deviceName, SIZEOF_IN_CHAR(periphDetails.deviceName)); // Description and Model name/icon are only used on the Device page // If the description control exists it must be the Device base property // sheet otherwise it is the smaller Status sheet from the printer object if ( hDescription ) { // set the description text dWord = sizeof(desc); dwResult = PALGetObject(hPeripheral, OT_PERIPHERAL_DESCRIPTION, 0, &desc, &dWord); if (dwResult == RC_SUCCESS) SetWindowText(hDescription, desc.description); else SetWindowText(hDescription, TEXT("")); } if ( hModelWnd ) { // install the model name SetDlgItemText(hWnd, IDC_MODELSTR, periphDetails.deviceName); // install the correct model icon dWord = sizeof(PeripheralIcon); dwResult = PALGetObject(hPeripheral, OT_PERIPHERAL_ICON, 0, &periphIcon, &dWord); if ( dwResult IS RC_SUCCESS ) hModelIcon = LoadIcon(periphIcon.hResourceModule, MAKEINTRESOURCE(periphIcon.iconResourceID)); Static_SetIcon(hModelWnd, hModelIcon); } // install capabilities in the capabilities listbox AddCapabilities(hWnd, hPeripheral, periphDetails.deviceName, periphDetails.deviceID); UpdateStatus(); return TRUE; // return TRUE unless you set the focus to a control } //......................................................... LRESULT OnContextHelpPrinter(WPARAM wParam, LPARAM lParam) { #ifdef WIN32 WinHelp((HWND)wParam, PRINTER_HELP_FILE, HELP_CONTEXTMENU, (DWORD)(LPSTR)keywordIDListPrinter); #endif return(1); } //......................................................... LRESULT OnF1HelpPrinter(WPARAM wParam, LPARAM lParam) { #ifdef WIN32 WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, PRINTER_HELP_FILE, HELP_WM_HELP, (DWORD)(LPSTR)keywordIDListPrinter); #endif return(1); } //......................................................... void UpdateStatus(void) { DWORD dWord, dwResult; HWND hFrontPanelTitle = GetDlgItem(hWnd, IDC_FPTITLE); HWND hFrontPanel = GetDlgItem(hWnd, IDC_FRONTPANEL); HWND hFrontPanelFrame = GetDlgItem(hWnd, IDC_FPANEL_FRAME); HWND hStatusFrame = GetDlgItem(hWnd, IDC_STATUS_FRAME); HWND hIconWnd = GetDlgItem(hWnd, IDC_STOPLIGHT); HWND hBitmapWnd = GetDlgItem(hWnd, IDC_PRINTERBMP); PeripheralStatus periphStatus; PeripheralPanel periphPanel; DWORD cBufSize = 128; TCHAR cBuf[128]; UINT newDeviceBitmap, newStatusBitmap; BOOL bFrontPanel = TRUE, bInvalidate = FALSE; BOOL b3DControls = FALSE; #ifdef WIN32 OSVERSIONINFO versionInfo; #endif #ifdef WIN32 versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&versionInfo); b3DControls = ( versionInfo.dwMajorVersion >= 4 ); #else DWORD dwVersion = GetVersion(); b3DControls = ( HIBYTE(LOWORD(dwVersion)) IS 95 ); #endif if ( hFrontPanel IS NULL ) return; dWord = sizeof(PeripheralDetails); dwResult = PALGetObject(hPeripheral, OT_PERIPHERAL_DETAILS, 0, &periphDetails, &dWord); if (dwResult != RC_SUCCESS) LoadString(hInstance, IDS_UNKNOWN_PRINTER, periphDetails.deviceName, SIZEOF_IN_CHAR(periphDetails.deviceName)); dWord = sizeof(PeripheralPanel); dwResult = PALGetObject(hPeripheral, OT_PERIPHERAL_PANEL, 0, &periphPanel, &dWord); if ( (dwResult == RC_SUCCESS) AND ( _tcslen(periphPanel.frontPanel) ) ) { SetWindowText(hFrontPanel, periphPanel.frontPanel); } else bFrontPanel = FALSE; ShowWindow(hFrontPanelTitle, bFrontPanel ? SW_SHOW : SW_HIDE); ShowWindow(hFrontPanel, bFrontPanel ? SW_SHOW : SW_HIDE); if ( !b3DControls ) { ShowWindow(hFrontPanelFrame, bFrontPanel ? SW_SHOW : SW_HIDE); ShowWindow(hStatusFrame, SW_SHOW); } else { ShowWindow(hFrontPanelFrame, SW_HIDE); ShowWindow(hStatusFrame, SW_HIDE); } // install current status message here dWord = sizeof(PeripheralStatus); dwResult = PALGetObject(hPeripheral, OT_PERIPHERAL_STATUS, 0, &periphStatus, &dWord); if (dwResult ISNT RC_SUCCESS) { periphStatus.hResourceModule = hInstance; periphStatus.statusResID = IDS_STATUS_UNAVAILABLE; periphStatus.severity = SEVERITY_RED; periphStatus.severityIcon = IDI_RED; periphStatus.helpContext = IDH_STAT_printer_error; _tcscpy(periphStatus.helpFilename, PRINTER_HELP_FILE); periphStatus.printerResID = GetDeviceBitmap(periphDetails.deviceID); } else { AMGetGraphics(hPeripheral, periphStatus.peripheralStatus, &periphStatus.printerResID, &periphStatus.statusBitmapID, &periphStatus.hBitmapModule, APPLET_PRINTER, periphDetails.deviceName); } _tcscpy(currentHelpFile, periphStatus.helpFilename); // Model bitmap newDeviceBitmap = periphStatus.printerResID; if ( oldDeviceBitmap ISNT newDeviceBitmap ) { SetPrinterBitmap(hBitmapWnd, periphStatus.hBitmapModule, newDeviceBitmap); oldDeviceBitmap = newDeviceBitmap; bInvalidate = TRUE; } // Set fields if ( dwCurrentStatus ISNT periphStatus.peripheralStatus ) { dwCurrentStatus = periphStatus.peripheralStatus; dwCurrentContext = periphStatus.helpContext; newStatusBitmap = periphStatus.statusBitmapID; if ( oldStatusBitmap ISNT newStatusBitmap ) { // status change SetStatusBitmap(hBitmapWnd, periphStatus.hBitmapModule, newStatusBitmap); oldStatusBitmap = newStatusBitmap; bInvalidate = TRUE; } LoadString(periphStatus.hResourceModule, periphStatus.statusResID, (LPTSTR)cBuf, SIZEOF_IN_CHAR(cBuf)); SetDlgItemText(hWnd, IDC_STATUSMSG, cBuf); } if ( bInvalidate IS TRUE ) InvalidateRect(hBitmapWnd, NULL, TRUE); // install correct stoplight here Static_SetIcon(GetDlgItem(hWnd, IDC_STOPLIGHT), hLightIcons[periphStatus.severity]); }