/************************************************************************* ** ** OLE 2 Sample Code ** ** dialogs.c ** ** This file contains dialog functions and support function ** ** (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved ** *************************************************************************/ #include "outline.h" OLEDBGDATA extern LPOUTLINEAPP g_lpApp; static char g_szBuf[MAXSTRLEN+1]; static LPSTR g_lpszDlgTitle; // REVIEW: should use string resource for messages static char ErrMsgInvalidRange[] = "Invalid Range entered!"; static char ErrMsgInvalidValue[] = "Invalid Value entered!"; static char ErrMsgInvalidName[] = "Invalid Name entered!"; static char ErrMsgNullName[] = "NULL string disallowed!"; static char ErrMsgNameNotFound[] = "Name doesn't exist!"; /* InputTextDlg * ------------ * * Put up a dialog box to allow the user to edit text */ BOOL InputTextDlg(HWND hWnd, LPSTR lpszText, LPSTR lpszDlgTitle) { int nResult; g_lpszDlgTitle = lpszDlgTitle; lstrcpy((LPSTR)g_szBuf, lpszText); // preload dialog with input text nResult = DialogBox(g_lpApp->m_hInst, (LPSTR)"AddEditLine", hWnd, (DLGPROC)AddEditDlgProc); if (nResult) { lstrcpy(lpszText, (LPSTR)g_szBuf); return TRUE; } else { return FALSE; } } /* AddEditDlgProc * -------------- * * This procedure is associated with the dialog box that is included in * the function name of the procedure. It provides the service routines * for the events (messages) that occur because the end user operates * one of the dialog box's buttons, entry fields, or controls. */ BOOL CALLBACK EXPORT AddEditDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam) { HWND hEdit; switch(Message) { case WM_INITDIALOG: /* initialize working variables */ hEdit=GetDlgItem(hDlg,IDD_EDIT); SendMessage(hEdit,EM_LIMITTEXT,(WPARAM)MAXSTRLEN,0L); SetWindowText(hDlg, g_lpszDlgTitle); SetDlgItemText(hDlg,IDD_EDIT, g_szBuf); break; /* End of WM_INITDIALOG */ case WM_CLOSE: /* Closing the Dialog behaves the same as Cancel */ PostMessage(hDlg, WM_COMMAND, IDCANCEL, 0L); break; /* End of WM_CLOSE */ case WM_COMMAND: switch (wParam) { case IDOK: /* save data values entered into the controls ** and dismiss the dialog box returning TRUE */ GetDlgItemText(hDlg,IDD_EDIT,(LPSTR)g_szBuf,MAXSTRLEN+1); EndDialog(hDlg, TRUE); break; case IDCANCEL: /* ignore data values entered into the controls ** and dismiss the dialog box returning FALSE */ EndDialog(hDlg, FALSE); break; } break; /* End of WM_COMMAND */ default: return FALSE; } return TRUE; } /* End of AddEditDlgProc */ /* SetLineHeightDlgProc * -------------------- * * Dialog procedure for set line height */ BOOL CALLBACK EXPORT SetLineHeightDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam) { BOOL fTranslated; BOOL fEnable; static LPINT lpint; int nHeight; static int nMaxHeight; switch (Message) { case WM_INITDIALOG: { char cBuf[80]; nMaxHeight = XformHeightInPixelsToHimetric(NULL, LISTBOX_HEIGHT_LIMIT); lpint = (LPINT)lParam; SetDlgItemInt(hDlg, IDD_EDIT, *lpint, FALSE); wsprintf(cBuf, "Maximum value is %d units", nMaxHeight); SetDlgItemText(hDlg, IDD_LIMIT, (LPSTR)cBuf); break; } case WM_COMMAND: switch (wParam) { case IDOK: if (IsDlgButtonChecked(hDlg, IDD_CHECK)) { *lpint = -1; } else { /* save the value in the edit control */ nHeight = GetDlgItemInt(hDlg, IDD_EDIT, (BOOL FAR*)&fTranslated, FALSE); if (!fTranslated || !nHeight || (nHeight>nMaxHeight)){ OutlineApp_ErrorMessage(g_lpApp, ErrMsgInvalidValue); break; } *lpint = nHeight; } EndDialog(hDlg, TRUE); break; case IDCANCEL: *lpint = 0; EndDialog(hDlg, FALSE); break; case IDD_CHECK: fEnable = !IsDlgButtonChecked(hDlg, IDD_CHECK); EnableWindow(GetDlgItem(hDlg, IDD_EDIT), fEnable); EnableWindow(GetDlgItem(hDlg, IDD_TEXT), fEnable); break; } break; /* WM_COMMAND */ case WM_CLOSE: /* Closing the Dialog behaves the same as Cancel */ PostMessage(hDlg, WM_COMMAND, IDCANCEL, 0L); break; /* End of WM_CLOSE */ default: return FALSE; } return TRUE; } /* end of SetLineHeightProc */ /* DefineNameDlgProc * ----------------- * * Dialog procedure for define name */ BOOL CALLBACK EXPORT DefineNameDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam) { static HWND hCombo; static LPOUTLINEDOC lpOutlineDoc = NULL; static LPOUTLINENAMETABLE lpOutlineNameTable = NULL; LPOUTLINENAME lpOutlineName = NULL; UINT nIndex; LINERANGE lrSel; BOOL fTranslated; switch(Message) { case WM_INITDIALOG: /* initialize working variables */ hCombo=GetDlgItem(hDlg,IDD_COMBO); lpOutlineDoc = (LPOUTLINEDOC) lParam; lpOutlineNameTable = OutlineDoc_GetNameTable(lpOutlineDoc); SendMessage(hCombo,CB_LIMITTEXT,(WPARAM)MAXNAMESIZE,0L); NameDlg_LoadComboBox(lpOutlineNameTable, hCombo); OutlineDoc_GetSel(lpOutlineDoc, (LPLINERANGE)&lrSel); lpOutlineName = OutlineNameTable_FindNamedRange( lpOutlineNameTable, &lrSel ); /* if current selection already has a name, hilight it */ if (lpOutlineName) { nIndex = (int) SendMessage( hCombo, CB_FINDSTRINGEXACT, (WPARAM)0xffff, (LPARAM)(LPCSTR)lpOutlineName->m_szName ); if (nIndex != CB_ERR) { SendMessage(hCombo, CB_SETCURSEL, (WPARAM)nIndex, 0L); } } SetDlgItemInt(hDlg, IDD_FROM, (UINT)lrSel.m_nStartLine+1,FALSE); SetDlgItemInt(hDlg, IDD_TO, (UINT)lrSel.m_nEndLine+1, FALSE); break; /* End of WM_INITDIALOG */ case WM_CLOSE: /* Closing the Dialog behaves the same as Cancel */ PostMessage(hDlg, WM_COMMAND, IDD_CLOSE, 0L); break; /* End of WM_CLOSE */ case WM_COMMAND: switch(wParam) { case IDOK: GetDlgItemText(hDlg,IDD_COMBO,(LPSTR)g_szBuf,MAXNAMESIZE); if(! SendMessage(hCombo,WM_GETTEXTLENGTH,0,0L)) { MessageBox( hDlg, ErrMsgNullName, NULL, MB_ICONEXCLAMATION ); break; } else if(SendMessage(hCombo,CB_GETCURSEL,0,0L)==CB_ERR && _fstrchr(g_szBuf, ' ')) { MessageBox( hDlg, ErrMsgInvalidName, NULL, MB_ICONEXCLAMATION ); break; } else { nIndex = (int) SendMessage(hCombo,CB_FINDSTRINGEXACT, (WPARAM)0xffff,(LPARAM)(LPCSTR)g_szBuf); /* Line indices are 1 less than the number in ** the row heading */ lrSel.m_nStartLine = GetDlgItemInt(hDlg, IDD_FROM, (BOOL FAR*)&fTranslated, FALSE) - 1; if(! fTranslated) { OutlineApp_ErrorMessage(g_lpApp, ErrMsgInvalidRange); break; } lrSel.m_nEndLine = GetDlgItemInt(hDlg, IDD_TO, (BOOL FAR*)&fTranslated, FALSE) - 1; if (!fTranslated || (lrSel.m_nStartLine < 0) || (lrSel.m_nEndLine < lrSel.m_nStartLine) || (lrSel.m_nEndLine >= OutlineDoc_GetLineCount( lpOutlineDoc))) { OutlineApp_ErrorMessage(g_lpApp, ErrMsgInvalidRange); break; } if(nIndex != CB_ERR) { NameDlg_UpdateName( hCombo, lpOutlineDoc, nIndex, g_szBuf, &lrSel ); } else { NameDlg_AddName( hCombo, lpOutlineDoc, g_szBuf, &lrSel ); } } // fall through case IDD_CLOSE: /* Ignore data values entered into the controls */ /* and dismiss the dialog window returning FALSE */ EndDialog(hDlg,0); break; case IDD_DELETE: GetDlgItemText(hDlg,IDD_COMBO,(LPSTR)g_szBuf,MAXNAMESIZE); if((nIndex=(int)SendMessage(hCombo,CB_FINDSTRINGEXACT, (WPARAM)0xffff,(LPARAM)(LPCSTR)g_szBuf))==CB_ERR) MessageBox(hDlg, ErrMsgNameNotFound, NULL, MB_ICONEXCLAMATION); else { NameDlg_DeleteName(hCombo, lpOutlineDoc, nIndex); } break; case IDD_COMBO: if(HIWORD(lParam) == CBN_SELCHANGE) { nIndex=(int)SendMessage(hCombo, CB_GETCURSEL, 0, 0L); lpOutlineName = (LPOUTLINENAME)SendMessage( hCombo, CB_GETITEMDATA, (WPARAM)nIndex, 0L ); SetDlgItemInt( hDlg, IDD_FROM, (UINT) lpOutlineName->m_nStartLine + 1, FALSE ); SetDlgItemInt( hDlg, IDD_TO, (UINT) lpOutlineName->m_nEndLine + 1, FALSE ); } } break; /* End of WM_COMMAND */ default: return FALSE; } return TRUE; } /* End of DefineNameDlgProc */ /* GotoNameDlgProc * --------------- * * Dialog procedure for goto name */ BOOL CALLBACK EXPORT GotoNameDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam) { static HWND hLBName; static LPOUTLINEDOC lpOutlineDoc = NULL; static LPOUTLINENAMETABLE lpOutlineNameTable = NULL; UINT nIndex; LINERANGE lrLineRange; LPOUTLINENAME lpOutlineName; switch(Message) { case WM_INITDIALOG: /* initialize working variables */ lpOutlineDoc = (LPOUTLINEDOC) lParam; lpOutlineNameTable = OutlineDoc_GetNameTable(lpOutlineDoc); hLBName=GetDlgItem(hDlg,IDD_LINELISTBOX); NameDlg_LoadListBox(lpOutlineNameTable, hLBName); // highlight 1st item SendMessage(hLBName, LB_SETCURSEL, 0, 0L); // trigger to initialize edit control SendMessage(hDlg, WM_COMMAND, (WPARAM)IDD_LINELISTBOX, MAKELONG(hLBName, LBN_SELCHANGE)); break; /* End of WM_INITDIALOG */ case WM_CLOSE: /* Closing the Dialog behaves the same as Cancel */ PostMessage(hDlg, WM_COMMAND, IDCANCEL, 0L); break; /* End of WM_CLOSE */ case WM_COMMAND: switch(wParam) { case IDD_LINELISTBOX: if(HIWORD(lParam) == LBN_SELCHANGE) { // update the line range display nIndex=(int)SendMessage(hLBName, LB_GETCURSEL, 0, 0L); lpOutlineName = (LPOUTLINENAME)SendMessage(hLBName, LB_GETITEMDATA, (WPARAM)nIndex,0L); if (lpOutlineName) { SetDlgItemInt( hDlg, IDD_FROM, (UINT) lpOutlineName->m_nStartLine + 1, FALSE ); SetDlgItemInt( hDlg, IDD_TO, (UINT) lpOutlineName->m_nEndLine + 1, FALSE ); } break; } // double click will fall through else if(HIWORD(lParam) != LBN_DBLCLK) break; case IDOK: nIndex=(int)SendMessage(hLBName,LB_GETCURSEL,0,0L); if(nIndex!=LB_ERR) { lpOutlineName = (LPOUTLINENAME)SendMessage(hLBName, LB_GETITEMDATA, (WPARAM)nIndex, 0L); lrLineRange.m_nStartLine=lpOutlineName->m_nStartLine; lrLineRange.m_nEndLine = lpOutlineName->m_nEndLine; OutlineDoc_SetSel(lpOutlineDoc, &lrLineRange); } // fall through case IDCANCEL: /* Ignore data values entered into the controls */ /* and dismiss the dialog window returning FALSE */ EndDialog(hDlg,0); break; } break; /* End of WM_COMMAND */ default: return FALSE; } return TRUE; } /* End of GotoNameDlgProc */ /* NameDlg_LoadComboBox * -------------------- * * Load defined names into combo box */ void NameDlg_LoadComboBox(LPOUTLINENAMETABLE lpOutlineNameTable,HWND hCombo) { LPOUTLINENAME lpOutlineName; int i, nIndex; int nCount; nCount=OutlineNameTable_GetCount((LPOUTLINENAMETABLE)lpOutlineNameTable); if(!nCount) return; SendMessage(hCombo,WM_SETREDRAW,(WPARAM)FALSE,0L); for(i=0; im_szName ); SendMessage(hCombo,CB_SETITEMDATA,(WPARAM)nIndex,(LPARAM)lpOutlineName); } SendMessage(hCombo,WM_SETREDRAW,(WPARAM)TRUE,0L); } /* NameDlg_LoadListBox * ------------------- * * Load defined names into list box */ void NameDlg_LoadListBox(LPOUTLINENAMETABLE lpOutlineNameTable,HWND hListBox) { int i; int nCount; int nIndex; LPOUTLINENAME lpOutlineName; nCount=OutlineNameTable_GetCount((LPOUTLINENAMETABLE)lpOutlineNameTable); SendMessage(hListBox,WM_SETREDRAW,(WPARAM)FALSE,0L); for(i=0; im_szName ); SendMessage(hListBox,LB_SETITEMDATA,(WPARAM)nIndex,(LPARAM)lpOutlineName); } SendMessage(hListBox,WM_SETREDRAW,(WPARAM)TRUE,0L); } /* NameDlg_AddName * --------------- * * Add a name to the name table corresponding to the name dialog * combo box. */ void NameDlg_AddName(HWND hCombo, LPOUTLINEDOC lpOutlineDoc, LPSTR lpszName, LPLINERANGE lplrSel) { LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp; LPOUTLINENAME lpOutlineName; lpOutlineName = OutlineApp_CreateName(lpOutlineApp); if (lpOutlineName) { lstrcpy(lpOutlineName->m_szName, lpszName); lpOutlineName->m_nStartLine = lplrSel->m_nStartLine; lpOutlineName->m_nEndLine = lplrSel->m_nEndLine; OutlineDoc_AddName(lpOutlineDoc, lpOutlineName); } else { // REVIEW: do we need error message here? } } /* NameDlg_UpdateName * ------------------ * * Update a name in the name table corresponding to a name in * the name dialog combo box. */ void NameDlg_UpdateName(HWND hCombo, LPOUTLINEDOC lpOutlineDoc, int nIndex, LPSTR lpszName, LPLINERANGE lplrSel) { LPOUTLINENAME lpOutlineName; lpOutlineName = (LPOUTLINENAME)SendMessage( hCombo, CB_GETITEMDATA, (WPARAM)nIndex, 0L ); OutlineName_SetName(lpOutlineName, lpszName); OutlineName_SetSel(lpOutlineName, lplrSel, TRUE /* name modified */); OutlineDoc_SetModified(lpOutlineDoc, TRUE, FALSE, FALSE); } /* NameDlg_DeleteName * ------------------ * * Delete a name from the name dialog combo box and corresponding * name table. */ void NameDlg_DeleteName(HWND hCombo, LPOUTLINEDOC lpOutlineDoc, UINT nIndex) { SendMessage(hCombo,CB_DELETESTRING,(WPARAM)nIndex,0L); OutlineDoc_DeleteName(lpOutlineDoc, nIndex); } /* PlaceBitmap * ----------- * * Places a bitmap centered in the specified control in the dialog on the * specified DC. * */ PlaceBitmap(HWND hDlg, int control, HDC hDC, HBITMAP hBitmap) { BITMAP bm; HDC hdcmem; HBITMAP hbmOld; RECT rcControl; // Rect of dialog control int width, height; GetObject(hBitmap, sizeof(BITMAP), &bm); hdcmem= CreateCompatibleDC(hDC); hbmOld = SelectObject(hdcmem, hBitmap); // Get rect of control in screen coords, and translate to our dialog // box's coordinates GetWindowRect(GetDlgItem(hDlg, control), &rcControl); MapWindowPoints(NULL, hDlg, (LPPOINT)&rcControl, 2); width = rcControl.right - rcControl.left; height = rcControl.bottom - rcControl.top; BitBlt(hDC, rcControl.left + (width - bm.bmWidth) / 2, rcControl.top + (height - bm.bmHeight) /2, bm.bmWidth, bm.bmHeight, hdcmem, 0, 0, SRCCOPY); SelectObject(hdcmem, hbmOld); DeleteDC(hdcmem); return 1; } /* AboutDlgProc * ------------ * * Dialog procedure for the About function */ BOOL CALLBACK EXPORT AboutDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam) { int narrVersion[2]; static HBITMAP hbmLogo; switch(Message) { case WM_INITDIALOG: // get version number of app wsprintf(g_szBuf, "About %s", (LPCSTR)APPNAME); SetWindowText(hDlg, (LPCSTR)g_szBuf); OutlineApp_GetAppVersionNo(g_lpApp, narrVersion); wsprintf(g_szBuf, "%s version %d.%d", (LPSTR) APPDESC, narrVersion[0], narrVersion[1]); SetDlgItemText(hDlg, IDD_APPTEXT, (LPCSTR)g_szBuf); // Load bitmap for displaying later hbmLogo = LoadBitmap(g_lpApp->m_hInst, "LogoBitmap"); TraceDebug(hDlg, IDD_BITMAPLOCATION); ShowWindow(GetDlgItem(hDlg, IDD_BITMAPLOCATION), SW_HIDE); break; case WM_PAINT: { PAINTSTRUCT ps; BeginPaint(hDlg, &ps); // Display bitmap in IDD_BITMAPLOCATION control area PlaceBitmap(hDlg, IDD_BITMAPLOCATION, ps.hdc, hbmLogo); EndPaint(hDlg, &ps); } break; case WM_CLOSE : PostMessage(hDlg, WM_COMMAND, IDOK, 0L); break; case WM_COMMAND : switch(wParam) { case IDOK: case IDCANCEL: if (hbmLogo) DeleteObject(hbmLogo); EndDialog(hDlg,0); break; } break; default : return FALSE; } return TRUE; }