summaryrefslogtreecommitdiffstats
path: root/private/sdktools/imagedit/propbar.c
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/sdktools/imagedit/propbar.c
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/sdktools/imagedit/propbar.c')
-rw-r--r--private/sdktools/imagedit/propbar.c496
1 files changed, 496 insertions, 0 deletions
diff --git a/private/sdktools/imagedit/propbar.c b/private/sdktools/imagedit/propbar.c
new file mode 100644
index 000000000..207c25e18
--- /dev/null
+++ b/private/sdktools/imagedit/propbar.c
@@ -0,0 +1,496 @@
+/****************************************************************************/
+/* */
+/* Microsoft Confidential */
+/* */
+/* Copyright (c) Microsoft Corp. 1987, 1990 */
+/* All Rights Reserved */
+/* */
+/****************************************************************************/
+/****************************** Module Header *******************************
+* Module Name: propbar.c
+*
+* Support for the Properties Bar.
+*
+* History:
+*
+****************************************************************************/
+
+#include "imagedit.h"
+#include "dialogs.h"
+
+
+#define IMPOSSIBLEVALUE 0x7FFF
+
+STATICFN VOID NEAR PropBarProcessCommand(HWND hwnd, INT idCtrl,
+ INT NotifyCode);
+
+/*
+ * Cache variables. These cache the values of some displayed fields.
+ * The field is updated only if the value changes, which avoids flicker.
+ * They are initialized to a large value so that the first "set" to
+ * any value will always cause the field to be updated.
+ */
+static INT xSave = IMPOSSIBLEVALUE;
+static INT ySave = IMPOSSIBLEVALUE;
+static INT cxSave = IMPOSSIBLEVALUE;
+static INT cySave = IMPOSSIBLEVALUE;
+static INT xHotSpotSave = IMPOSSIBLEVALUE;
+static INT yHotSpotSave = IMPOSSIBLEVALUE;
+
+
+
+/************************************************************************
+* PropBarDlgProc
+*
+* This is the dialog procedure for the PropBar ribbon window.
+*
+* History:
+*
+************************************************************************/
+
+DIALOGPROC PropBarDlgProc(
+ HWND hwnd,
+ UINT msg,
+ WPARAM wParam,
+ LONG lParam)
+{
+ switch (msg) {
+ case WM_INITDIALOG:
+ /*
+ * Set this global right away. Other routines that
+ * might be called before CreateDialog returns depend
+ * on this global.
+ */
+ ghwndPropBar = hwnd;
+
+ PropBarUpdate();
+
+ /*
+ * Return TRUE so that the dialog manager does NOT
+ * set the focus for me. This prevents the PropBar
+ * window from initially having the focus when the
+ * editor is started.
+ */
+ return TRUE;
+
+ case WM_PAINT:
+ {
+ HDC hdc;
+ RECT rc;
+ PAINTSTRUCT ps;
+ HPEN hpenWindowFrame;
+
+ /*
+ * Draw our border lines.
+ */
+ GetClientRect(hwnd, &rc);
+ hdc = BeginPaint(hwnd, &ps);
+
+ SelectObject(hdc, GetStockObject(WHITE_PEN));
+ MMoveTo(hdc, rc.left, rc.top);
+ LineTo(hdc, rc.right, rc.top);
+
+ SelectObject(hdc, hpenDarkGray);
+ MMoveTo(hdc, rc.left, (rc.top + gcyPropBar) - gcyBorder - 1);
+ LineTo(hdc, rc.right, (rc.top + gcyPropBar) - gcyBorder - 1);
+
+ hpenWindowFrame = CreatePen(PS_SOLID, gcyBorder,
+ GetSysColor(COLOR_WINDOWFRAME));
+ SelectObject(hdc, hpenWindowFrame);
+ MMoveTo(hdc, rc.left, (rc.top + gcyPropBar) - gcyBorder);
+ LineTo(hdc, rc.right, (rc.top + gcyPropBar) - gcyBorder);
+
+ EndPaint(hwnd, &ps);
+ DeleteObject(hpenWindowFrame);
+ }
+
+ break;
+
+ case WM_CTLCOLOR:
+ case WM_CTLCOLORBTN:
+ case WM_CTLCOLORDLG:
+ case WM_CTLCOLORLISTBOX:
+ case WM_CTLCOLORSTATIC:
+ switch (GET_WM_CTLCOLOR_TYPE(wParam, lParam, msg)) {
+ case CTLCOLOR_BTN:
+ case CTLCOLOR_DLG:
+ case CTLCOLOR_LISTBOX:
+ return (BOOL)GetStockObject(LTGRAY_BRUSH);
+
+ case CTLCOLOR_STATIC:
+ SetBkColor(GET_WM_CTLCOLOR_HDC(wParam, lParam, msg),
+ RGB_LIGHTGRAY);
+ return (BOOL)GetStockObject(LTGRAY_BRUSH);
+ }
+
+ return (BOOL)NULL;
+
+ case WM_COMMAND:
+ PropBarProcessCommand(hwnd,
+ GET_WM_COMMAND_ID(wParam, lParam),
+ GET_WM_COMMAND_CMD(wParam, lParam));
+ break;
+
+ case WM_DESTROY:
+ /*
+ * Null out the global window handle for the prop bar
+ * for safety's sake.
+ */
+ ghwndPropBar = NULL;
+
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+
+
+/************************************************************************
+* PropBarProcessCommand
+*
+*
+* Arguments:
+* HWND hwnd - The window handle.
+* INT idCtrl - The id of the control the WM_COMMAND is for.
+* INT NotifyCode - The control's notification code.
+*
+* History:
+*
+************************************************************************/
+
+STATICFN VOID NEAR PropBarProcessCommand(
+ HWND hwnd,
+ INT idCtrl,
+ INT NotifyCode)
+{
+ INT iSelect;
+ PIMAGEINFO pImage;
+
+ switch (idCtrl) {
+ case DID_PROPBARIMAGE:
+ if (NotifyCode == CBN_SELCHANGE) {
+ if ((iSelect = (INT)SendDlgItemMessage(hwnd,
+ DID_PROPBARIMAGE, CB_GETCURSEL, 0, 0L)) != CB_ERR) {
+ /*
+ * Get a pointer to the selected image (stored in the
+ * listbox items data field).
+ */
+ pImage = (PIMAGEINFO)SendDlgItemMessage(hwnd,
+ DID_PROPBARIMAGE, CB_GETITEMDATA, iSelect, 0L);
+
+ /*
+ * Open the image. If it fails, be sure to set the
+ * combobox selection back to the current image.
+ */
+ if (!ImageOpen(pImage)) {
+ PropBarSetImage(gpImageCur);
+ break;
+ }
+
+ SetFocus(ghwndMain);
+ }
+ }
+
+ break;
+
+ case IDOK:
+ case IDCANCEL:
+ SetFocus(ghwndMain);
+ break;
+ }
+}
+
+
+
+/************************************************************************
+* PropBarUpdate
+*
+* This function updates the Properties Bar for the selection of a
+* new image or file. It fills the Image combo with the names of
+* the images in the current file and shows/hides the HotSpot display.
+*
+* History:
+*
+************************************************************************/
+
+VOID PropBarUpdate(VOID)
+{
+ HWND hwndCombo;
+ PIMAGEINFO pImage;
+ INT idLabel;
+ INT i;
+
+ if (gpImageCur || gpszFileName) {
+ switch (giType) {
+ case FT_BITMAP:
+ idLabel = IDS_BITMAPIMAGELABEL;
+ break;
+
+ case FT_ICON:
+ idLabel = IDS_ICONIMAGELABEL;
+ break;
+
+ case FT_CURSOR:
+ idLabel = IDS_CURSORIMAGELABEL;
+ break;
+ }
+ }
+ else {
+ idLabel = IDS_NULL;
+ }
+
+ SetDlgItemText(ghwndPropBar, DID_PROPBARIMAGELABEL, ids(idLabel));
+
+ /*
+ * Get the handle to the combo box and clear out all items.
+ */
+ hwndCombo = GetDlgItem(ghwndPropBar, DID_PROPBARIMAGE);
+ SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0);
+
+ /*
+ * Fill the combo box with the images.
+ */
+ for (pImage = gpImageHead; pImage; pImage = pImage->pImageNext) {
+ i = (INT)SendMessage(hwndCombo, CB_INSERTSTRING, (WPARAM)-1,
+ pImage->pDevice ?
+ (DWORD)(LPSTR)pImage->pDevice->szDesc :
+ (DWORD)(LPSTR)ids(IDS_UNKNOWNIMAGEFORMAT));
+
+ SendMessage(hwndCombo, CB_SETITEMDATA, i, (DWORD)(LPSTR)pImage);
+ }
+
+ /*
+ * Select the current image.
+ */
+ PropBarSetImage(gpImageCur);
+
+ /*
+ * Show/Hide the HotSpot info depending on whether this is
+ * a cursor or not.
+ */
+ if (giType == FT_CURSOR) {
+ if (gpImageCur)
+ PropBarSetHotSpot(gpImageCur->iHotspotX, gpImageCur->iHotspotY);
+ else
+ PropBarClearHotSpot();
+
+ PropBarShowHotSpot(TRUE);
+ }
+ else {
+ PropBarShowHotSpot(FALSE);
+ }
+}
+
+
+
+/************************************************************************
+* PropBarSetImage
+*
+*
+* History:
+*
+************************************************************************/
+
+VOID PropBarSetImage(
+ PIMAGEINFO pImage)
+{
+ if (pImage)
+ SendDlgItemMessage(ghwndPropBar, DID_PROPBARIMAGE, CB_SELECTSTRING,
+ (WPARAM)-1, (DWORD)(LPSTR)pImage->pDevice->szDesc);
+ else
+ SendDlgItemMessage(ghwndPropBar, DID_PROPBARIMAGE, CB_SETCURSEL,
+ (WPARAM)-1, (LPARAM)0);
+}
+
+
+
+/************************************************************************
+* PropBarSetPos
+*
+*
+* Arguments:
+*
+* History:
+*
+************************************************************************/
+
+VOID PropBarSetPos(
+ INT x,
+ INT y)
+{
+ CHAR szBuf[CCHTEXTMAX];
+
+ if (x != xSave || y != ySave) {
+ wsprintf(szBuf, "%d, %d", x, y);
+ SetDlgItemText(ghwndPropBar, DID_PROPBARPOS, szBuf);
+
+ /*
+ * Save them for the next time.
+ */
+ xSave = x;
+ ySave = y;
+ }
+}
+
+
+
+/************************************************************************
+* PropBarClearPos
+*
+*
+* Arguments:
+*
+* History:
+*
+************************************************************************/
+
+VOID PropBarClearPos(VOID)
+{
+ SetDlgItemText(ghwndPropBar, DID_PROPBARPOS, "");
+
+ /*
+ * Reset the cache variables so that the next "set" of
+ * the position is sure to update the display fields.
+ */
+ xSave = IMPOSSIBLEVALUE;
+ ySave = IMPOSSIBLEVALUE;
+}
+
+
+
+/************************************************************************
+* PropBarSetSize
+*
+*
+* Arguments:
+*
+* History:
+*
+************************************************************************/
+
+VOID PropBarSetSize(
+ POINT pt1,
+ POINT pt2)
+{
+ CHAR szBuf[CCHTEXTMAX];
+ INT cx;
+ INT cy;
+
+ NormalizePoints(&pt1, &pt2);
+ cx = ((pt2.x - pt1.x) / gZoomFactor) + 1;
+ cy = ((pt2.y - pt1.y) / gZoomFactor) + 1;
+
+ if (cx != cxSave || cy != cySave) {
+ wsprintf(szBuf, "%dx%d", cx, cy);
+ SetDlgItemText(ghwndPropBar, DID_PROPBARSIZE, szBuf);
+
+ /*
+ * Save them for the next time.
+ */
+ cxSave = cx;
+ cySave = cy;
+ }
+}
+
+
+
+/************************************************************************
+* PropBarClearSize
+*
+*
+* Arguments:
+*
+* History:
+*
+************************************************************************/
+
+VOID PropBarClearSize(VOID)
+{
+ SetDlgItemText(ghwndPropBar, DID_PROPBARSIZE, "");
+
+ /*
+ * Reset the cache variables so that the next "set" of
+ * the position is sure to update the display fields.
+ */
+ cxSave = IMPOSSIBLEVALUE;
+ cySave = IMPOSSIBLEVALUE;
+}
+
+
+
+/************************************************************************
+* PropBarSetHotSpot
+*
+*
+* Arguments:
+*
+* History:
+*
+************************************************************************/
+
+VOID PropBarSetHotSpot(
+ INT xHotSpot,
+ INT yHotSpot)
+{
+ CHAR szBuf[CCHTEXTMAX];
+
+ if (xHotSpot != xHotSpotSave || yHotSpot != yHotSpotSave) {
+ wsprintf(szBuf, "%d, %d", xHotSpot, yHotSpot);
+ SetDlgItemText(ghwndPropBar, DID_PROPBARHOTSPOT, szBuf);
+
+ /*
+ * Save them for the next time.
+ */
+ xHotSpotSave = xHotSpot;
+ yHotSpotSave = yHotSpot;
+ }
+}
+
+
+
+/************************************************************************
+* PropBarClearHotSpot
+*
+*
+* Arguments:
+*
+* History:
+*
+************************************************************************/
+
+VOID PropBarClearHotSpot(VOID)
+{
+ SetDlgItemText(ghwndPropBar, DID_PROPBARHOTSPOT, "");
+
+ /*
+ * Reset the cache variables so that the next "set" of
+ * the hotspot is sure to update the display fields.
+ */
+ xHotSpotSave = IMPOSSIBLEVALUE;
+ yHotSpotSave = IMPOSSIBLEVALUE;
+}
+
+
+
+/************************************************************************
+* PropBarShowHotSpot
+*
+*
+* Arguments:
+*
+* History:
+*
+************************************************************************/
+
+VOID PropBarShowHotSpot(
+ BOOL fShow)
+{
+ ShowWindow(GetDlgItem(ghwndPropBar, DID_PROPBARHOTSPOTLABEL),
+ fShow ? SW_SHOWNA : SW_HIDE);
+ ShowWindow(GetDlgItem(ghwndPropBar, DID_PROPBARHOTSPOT),
+ fShow ? SW_SHOWNA : SW_HIDE);
+}