File:  [WindowsNT SDKs] / mstools / samples / porttool / porttool.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Thu Aug 9 18:22:11 2018 UTC (7 years, 9 months ago) by root
Branches: msft, MAIN
CVS tags: ntsdk-oct-1992, HEAD
Microsoft Windows NT Build 328 10-12-1992

#include "porttool.h"
#include "port.h"

// forward declarations of helper functions in this module
HWND   WINAPI StartInteractive (HANDLE, char *, int);
HANDLE WINAPI StartBackground (HANDLE, HWND, char *);
VOID   WINAPI InitializeMenu (HWND, HANDLE);
LONG   WINAPI CommandHandler (HWND, UINT, LONG);
int    WINAPI SetWrap (HWND);
BOOL   WINAPI GetCmdLine (char *, char *, BOOL *);
int    WINAPI Save_YNC (HWND);
VOID   WINAPI SetWindowTitle (HWND, char*);
VOID   WINAPI GetEditSubString (HWND, PUINT, PUINT, char *);

UINT	uSearchMsg;
HWND	hDlgPortStatus;
HWND	hDlgPort;


// test case static variables for background porting
HANDLE		    hEvents[nBKPORTEVENTS];
BKPORTFILESTRUCT    BkPort;



// entry point ot this executable
int WINAPI WinMain (hInstance, hPrevInstance, lpCmdLine, nCmdShow)
    HANDLE hInstance;
    HANDLE hPrevInstance;
    LPSTR  lpCmdLine;
    int    nCmdShow;
{
    MSG        msg;
    HWND       hWnd;
    HANDLE     hAccel;
    BOOL       bBkgnd = 0;
    char       *lpszBuff = NULL;
    char       *lpszCmdLine = NULL;
    char       *lpCL;


    // previous instances do not exist in Win32
    if (hPrevInstance)
	return 0;

    // parse and copy command line parameters to local memory
    lpCL = GetCommandLine ();
    if (lpszCmdLine = (char *)LocalAlloc (LPTR, strlen (lpCL) + 1))
	GetCmdLine (lpCL, lpszCmdLine, &bBkgnd);

    // if /b switch, start background porting session
    if (bBkgnd)
	{
	// invoke background port status dialog
	if (!(hDlgPortStatus = StartBackground (hInstance, NULL, lpszCmdLine)))
	    return FALSE;
	}

    // start interactive porting session
    else
	{
	if (!(hWnd = StartInteractive (hInstance, lpszCmdLine, nCmdShow)))
	    return FALSE;
	}

    // free memory allocated for pCmdLine
    if (lpszCmdLine)
	LocalFree ((HLOCAL)lpszCmdLine);

    // load main accelerator table
    hAccel = LoadAccelerators (hInstance, MAKEINTRESOURCE (IDA_PORTTOOL));

    // main window message loop
    while (GetMessage (&msg, NULL, 0, 0))
	{
	if ((!hDlgSearch     || !IsDialogMessage (hDlgSearch, &msg))	 &&
	    (!hDlgPort	     || !IsDialogMessage (hDlgPort, &msg))	 &&
	    (!hDlgPortStatus || !IsDialogMessage (hDlgPortStatus, &msg)) &&
	    (!hAccel	     || !TranslateAccelerator (hWnd, hAccel, &msg)))
	    {
	    TranslateMessage (&msg);
	    DispatchMessage (&msg);
	    }
	}

    // return success of application
    return TRUE;
}




// start background port status dialog
HANDLE WINAPI StartBackground (
    HANDLE    hModule,
    HWND      hWndParent,
    char      *lpszCmdLine)
{
    return (CreateDialogParam (hModule,
			       IDD_BKPORTDIALOG,
			       hWndParent,
			       BkPortDlgProc,
			       (LPARAM)lpszCmdLine));
}




// start interactive version of app
HWND WINAPI StartInteractive (
    HANDLE    hInstance,
    char      *lpszCmdLine,
    int       nCmdShow)
    {
    WNDCLASS   wc;
    char       lpszClass[MAX_PATH];
    HWND       hWnd;

    // load resources strings
    LoadString (hInstance, IDS_APPNAME, lpszClass, sizeof (lpszClass));

    /* Register the frame class */
    wc.style	     = 0;
    wc.lpfnWndProc   = (WNDPROC)MainWndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = CBWNDEXTRA;
    wc.hInstance     = hInstance;
    wc.hIcon	     = LoadIcon (hInstance, IDPortTool);
    wc.hCursor	     = LoadCursor (NULL,IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = IDPortTool;
    wc.lpszClassName = lpszClass;

    if (!RegisterClass (&wc) )
	return FALSE;

    /* Create the frame */
    hWnd = CreateWindow (lpszClass,
			 "Win32 Port",
			 WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | DS_LOCALEDIT,
			 CW_USEDEFAULT,
			 0,
			 CW_USEDEFAULT,
			 0,
			 NULL,
			 NULL,
			 hInstance,
			 (*lpszCmdLine ? lpszCmdLine : 0));

    // make sure window was created
    if (!hWnd)
	return FALSE;

    // register search/replace message for common dialog use
    uSearchMsg = RegisterWindowMessage ((char *)FINDMSGSTRING);

    // show and update main window
    ShowWindow (hWnd, nCmdShow);
    UpdateWindow (hWnd);

    return hWnd;
}



// main window procedure
LONG WINAPI MainWndProc (
    HWND    hWnd,
    UINT    uMsg,
    UINT    uParam,
    LONG    lParam)
{
	LONG	lRet = 1;
	int	nResult;
	RECT	rc;

    switch (uMsg)
	{
	case WM_CREATE:
	    {
	    HWND	      hWndEdit;
	    LPCREATESTRUCT    lpcs = (LPCREATESTRUCT)lParam;
	    char	      lpszBuff[MAX_PATH];
	    LOGFONT	      lfEditFont;
	    HFONT	      hFont;
	    HCURSOR	      hOldCursor;

	    // put hourglass cursor up
	    hOldCursor = (HCURSOR)SetClassLong (hWnd, GCL_HCURSOR, NULL);
	    SetCursor (LoadCursor (NULL, IDC_WAIT));

	    /* Create an edit control */
	    GetClientRect (hWnd, &rc);
	    hWndEdit = CreateWindow ("edit",
				     " ",
				     WS_CHILD | WS_VISIBLE | DS_LOCALEDIT |
					 WS_HSCROLL | WS_VSCROLL |
					 ES_AUTOHSCROLL | ES_AUTOVSCROLL |
					 ES_MULTILINE | ES_NOHIDESEL,
				     rc.left,
				     rc.top,
				     rc.right-rc.left,
				     rc.bottom-rc.top,
				     hWnd,
				     (HMENU)IDC_EDIT,
				     (HANDLE)GetModuleHandle (NULL),
				     0);

	    // if edit control failed, abort aplication
	    if (!IsWindow (hWndEdit))
		{
		ErrorNotify (hWnd, IDS_EDITWNDFAILED);
		return FALSE;
		}

	    // save edit window handle and init state variables
	    SetWindowLong (hWnd, WL_HWNDEDIT, (LONG) hWndEdit);
	    SetWindowWord (hWnd, WW_SCROLL, TRUE);
	    SetWindowWord (hWnd, WW_UNTITLED, TRUE);
	    SetWindowWord (hWnd, WW_SEARCHCASE, TRUE);
	    SetWindowWord (hWnd, WW_SEARCHDN, TRUE);
	    SetWindowLong (hWnd, WL_HPTRDEVNAMES, 0);

	    // get printer configuration
	    if (!GetPrinterConfig (hWnd))
		ErrorNotify (hWnd, IDS_PTRCONFIGFAILED);

	    // if initialization file passed, load file now
	    if (lpcs->lpCreateParams)
		{
		// load filename passed at initialization
		if ((nResult = LoadFile (hWnd, lpcs->lpCreateParams)) > 0)
		    {
		    // save filename and path in global string
		    strcpy (lpszFilePath, lpcs->lpCreateParams);

		    // The file has a title, so reset the UNTITLED flag.
		    SetWindowWord(hWnd, WW_UNTITLED, FALSE);

		    // extract filename from path
		    GetFileFromPath (lpszFilePath, lpszBuff);

		    // set window text title to be "AppName - filename"
		    SetWindowTitle (hWnd, lpszBuff);
		    }
		else
		    {
		    // notify user of error
		    ErrorNotify (hWnd, nResult);

		    // set window title to "AppName - Untitled"
		    LoadString ((HANDLE)GetModuleHandle (NULL),
				IDS_UNTITLED,
				lpszBuff,
				sizeof (lpszBuff));
		    SetWindowTitle (hWnd, lpszBuff);
		    }
		}
	    else
		{
		// set window title to "AppName - Untitled"
		LoadString ((HANDLE)GetModuleHandle (NULL),
			    IDS_UNTITLED,
			    lpszBuff,
			    sizeof (lpszBuff));
		SetWindowTitle (hWnd, lpszBuff);

		// set global file and path variables to null
		*lpszFilePath = 0;
		}

	    // create fixed pitch font as default font
	    lfEditFont.lfHeight = 16;
	    lfEditFont.lfWidth = 0;
	    lfEditFont.lfEscapement = 0;
	    lfEditFont.lfOrientation = 0;
	    lfEditFont.lfWeight = 400;
	    lfEditFont.lfItalic = FALSE;
	    lfEditFont.lfUnderline = FALSE;
	    lfEditFont.lfStrikeOut = FALSE;
	    lfEditFont.lfCharSet = ANSI_CHARSET;
	    lfEditFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
	    lfEditFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	    lfEditFont.lfQuality = DEFAULT_QUALITY;
	    lfEditFont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
	    *lfEditFont.lfFaceName = 0;

	    // make scroll bars initially visible
	    SetScrollRange (hWndEdit, SB_VERT, 0, 100, TRUE);
	    SetScrollRange (hWndEdit, SB_HORZ, 0, 100, TRUE);

	    // create the logical font
	    if (hFont = CreateFontIndirect (&lfEditFont))
		SendMessage (hWndEdit, WM_SETFONT, (UINT)hFont, 0);
	    else
		ErrorNotify (hWnd, IDS_FONTFAILEDTOCREATE);

	    // remove hourglass cursor
	    SetClassLong (hWnd, GCL_HCURSOR, (LONG)hOldCursor);
	    SetCursor (hOldCursor);

	    // set focus to edit window
	    SetFocus (hWndEdit);
	    }
	    break;

	case WM_SIZE:
	    {
	    RECT    rc;
	    HWND    hWndEdit;

	    // resize the edit control to match the client area
	    hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
	    GetClientRect (hWnd, &rc);
	    MoveWindow (hWndEdit,
			rc.left,
			rc.top,
			rc.right-rc.left,
			rc.bottom-rc.top,
			TRUE);
	    }
	    break;

	case WM_SETFOCUS:
	    SetFocus ((HWND)GetWindowLong (hWnd, WL_HWNDEDIT));
	    break;

	case WM_INITMENU:
	    // initialize menuitems
	    InitializeMenu (hWnd, (HMENU)uParam);
	    break;

	case WM_WININICHANGE:
	case WM_DEVMODECHANGE:
	    // get printer configuration
	    GetPrinterConfig (hWnd);
	    break;

	case WM_COMMAND:
	    // handle all command messages in a localized function
	    lRet = CommandHandler (hWnd, uParam, lParam);
	    break;

	case WM_CLOSE:
	case WM_QUERYENDSESSION:
	    {
	    HWND    hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);

	    // check if there are changes to the edit contents, and offer to save first
	    if (SendMessage (hWndEdit, EM_GETMODIFY, 0, 0))
		{
		switch (Save_YNC (hWnd))
		    {
		    case IDCANCEL:
			// abort exit
			return FALSE;
		    case IDYES:
			// save data then continue
			if (!SendMessage (hWnd, WM_COMMAND, (UINT)UM_SAVEFILE, 0))
			    return FALSE;
		    case IDNO:
			// just fall through
			break;
		    }
		}

	    // call destroy window to cleanup and go away
	    DestroyWindow (hWnd);
	    }
	    break;

	case WM_DESTROY:
	    {
	    HFONT    hFont = (HFONT)SendMessage ((HWND)GetWindowLong (hWnd, WL_HWNDEDIT),
						 WM_GETFONT,
						 0,
						 0);

	    // destroy font handle from edit control if exists
	    if (hFont)
		DeleteObject (hFont);

	    PostQuitMessage (0);
	    }
	    break;

	default:
	    // process common dialog search message here, then break
	    if (uMsg == uSearchMsg)
		{
		LPFINDREPLACE	 lpfr = (LPFINDREPLACE)lParam;

		if (lpfr->Flags & FR_DIALOGTERM)
		    {
		    // save case and direction
		    SetWindowWord (hWnd, WW_SEARCHCASE, (WORD)(lpfr->Flags & FR_MATCHCASE));
		    SetWindowWord (hWnd, WW_SEARCHDN, (WORD)(lpfr->Flags & FR_DOWN));
		    hDlgSearch = NULL;
		    }

		else if (lpfr->Flags & FR_FINDNEXT)
		    if (!LocateText (hWnd,
				     (WORD)(lpfr->Flags & FR_MATCHCASE),
				     (WORD)(lpfr->Flags & FR_DOWN),
				     lpszSearch))
			ErrorNotify (hWnd, IDS_STRINGNOTFOUND);
		break;
		}

	    // pass all unhandled messages to DefWindowProc
	    lRet = DefWindowProc (hWnd, uMsg, uParam, lParam);
	    break;
	}

    // return 1 if handled message, 0 if not
    return lRet;
}



// about box dialog procedure
BOOL WINAPI AboutDlgProc (
    HWND    hwnd,
    UINT    uMsg,
    UINT    uParam,
    LONG    lParam)
{
    BOOL    bRet = TRUE;

    switch (uMsg)
	{
	case WM_COMMAND:
	    switch (LOWORD (uParam))
		{
		// end dialog with TRUE or FALSE for OK or CANCEL
		case IDOK:
		case IDCANCEL:
		    EndDialog(hwnd, (LOWORD (uParam) == IDOK));
		    break;

		default:
		    bRet = FALSE;
		}
	    break;

	default:
	    bRet =  FALSE;
	    break;
	}
    return bRet;
}



// initialize menu function
VOID WINAPI InitializeMenu (
    HWND    hWnd,
    HANDLE  hMenu)
{
    WORD    mfStatus;
    DWORD   dwSel;
    HWND    hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
    WORD    wScroll;

    // see if edit control can undo last command
    if (SendMessage (hWndEdit, EM_CANUNDO, 0, 0L))
	mfStatus = MF_ENABLED;
    else
	mfStatus = MF_GRAYED;
    EnableMenuItem (hMenu, IDM_EDITUNDO, mfStatus);

    // enable menuitems CUT, COPY and CLEAR if selected text
    dwSel = SendMessage (hWndEdit, EM_GETSEL, 0, 0);
    mfStatus = (WORD)((LOWORD(dwSel) == HIWORD(dwSel))?MF_GRAYED:MF_ENABLED);
    EnableMenuItem (hMenu, IDM_EDITCUT, mfStatus);
    EnableMenuItem (hMenu, IDM_EDITCOPY, mfStatus);
    EnableMenuItem (hMenu, IDM_EDITCLEAR, mfStatus);

    // if text allow for new file, enable menuitem
    if (SendMessage (hWndEdit, WM_GETTEXTLENGTH, NULL, NULL))
	EnableMenuItem (hMenu, IDM_FILENEW, MF_ENABLED);
    else
	EnableMenuItem (hMenu, IDM_FILENEW, MF_GRAYED);

    // if CF_TEXT format data is available in clipboard
    if (OpenClipboard (hWnd) & IsClipboardFormatAvailable (CF_TEXT))
	EnableMenuItem (hMenu, IDM_EDITPASTE, MF_ENABLED);
    else
	EnableMenuItem (hMenu, IDM_EDITPASTE, MF_GRAYED);
    CloseClipboard ();

    // set the scroll bars menuitem
    wScroll = GetWindowWord (hWnd, WW_SCROLL);
    CheckMenuItem (hMenu, IDM_EDITSCROLL, (UINT)(wScroll ? MF_CHECKED : MF_UNCHECKED));

    // set the word wrap state for the window
    dwSel = GetWindowLong (hWndEdit, GWL_STYLE);
    CheckMenuItem (hMenu,
		   IDM_EDITWRAP,
		   (UINT)((dwSel & ES_AUTOHSCROLL) ? MF_UNCHECKED : MF_CHECKED));

    // enable search menuitems if a search string exists
    if (*lpszSearch)
	{
	EnableMenuItem (hMenu, IDM_SEARCHNEXT, MF_ENABLED);
	EnableMenuItem (hMenu, IDM_SEARCHPREV, MF_ENABLED);
	}
    else
	{
	EnableMenuItem (hMenu, IDM_SEARCHNEXT, MF_GRAYED);
	EnableMenuItem (hMenu, IDM_SEARCHPREV, MF_GRAYED);
	}

    // enable Print menuitems if a printer is available
    if (GetWindowLong (hWnd, WL_HPTRDEVNAMES))
	{
	EnableMenuItem (hMenu, IDM_FILEPRINT, MF_ENABLED);
	EnableMenuItem ( hMenu, IDM_FILESETUP, MF_ENABLED);
	}
    else
	{
	EnableMenuItem (hMenu, IDM_FILEPRINT, MF_GRAYED);
	EnableMenuItem ( hMenu, IDM_FILESETUP, MF_GRAYED);
	}

    // menuitems that are always enabled
    EnableMenuItem(hMenu, IDM_EDITSCROLL, MF_ENABLED);
    EnableMenuItem(hMenu, IDM_EDITSELECT, MF_ENABLED);
    EnableMenuItem(hMenu, IDM_EDITWRAP, MF_ENABLED);
    EnableMenuItem(hMenu, IDM_SEARCHFIND, MF_ENABLED);
}



// handle all WM_COMMAND messages here
LONG WINAPI CommandHandler (
    HWND    hWnd,
    UINT    uParam,
    LONG    lParam)
{
    int     nResult;
    HWND    hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);

    switch (LOWORD(uParam))
	{
	case IDM_FILENEW:
	    {
	    char    lpszMsg[MAX_PATH];

	    // check if there are changes, and offer to save first
	    if (SendMessage (hWndEdit, EM_GETMODIFY, 0, 0))
		{
		switch (Save_YNC (hWnd))
		    {
		    case IDCANCEL:
			// abort operation
			return FALSE;
		    case IDYES:
			// save data then continue if successful
			if (!SendMessage (hWnd, WM_COMMAND, (UINT)UM_SAVEFILE, 0))
			    return FALSE;
		    case IDNO:
			// just fall through
			break;
		    }

		// reset edit changes flag
		SendMessage (hWndEdit, EM_SETMODIFY, FALSE, 0);
		}

	    // clear edit control
	    SetWindowText (hWndEdit, "");

	    // set window title to "Untitled"
	    LoadString ((HANDLE)GetModuleHandle (NULL),
			IDS_UNTITLED,
			lpszMsg,
			sizeof (lpszMsg));
	    SetWindowTitle (hWnd, lpszMsg);
	    SetWindowWord (hWnd, WW_UNTITLED, TRUE);

	    // reset caret position by sending WM_KILLFOCUS/WM_SETFOCUS messages
	    SetFocus (NULL);
	    SetFocus (hWndEdit);
	    }
	    break;

	case IDM_FILEOPEN:
	    {
	    char    lpszFileName[MAX_PATH];
	    int     nResult;

	    // if changes to current file, ask to save first
	    if (SendMessage (hWndEdit, EM_GETMODIFY, 0, 0))
		{
		switch (Save_YNC (hWnd))
		    {
		    case IDCANCEL:
			// abort operation
			return FALSE;
		    case IDYES:
			// save data then continue
			if (!SendMessage (hWnd, WM_COMMAND, (UINT)UM_SAVEFILE, 0))
			    return FALSE;
		    case IDNO:
			// just fall through
			break;
		    }

		// reset edit changes flag
		SendMessage (hWndEdit, EM_SETMODIFY, FALSE, 0);
		}

	    // get new filename and load into edit control
	    if (GetFileName (hWnd, lpszFileName, lpszFilePath))
		{
		if ((nResult = LoadFile (hWnd, lpszFilePath)) < 0)
		    // notify user of error
		    ErrorNotify (hWnd, nResult);
		else
		    {
		    // update window text
		    SetWindowTitle (hWnd, lpszFileName);
		    SetWindowWord (hWnd, WW_UNTITLED, FALSE);
		    }
		}
	    else
		return FALSE;
	    }
	    break;

	case IDM_FILESAVEAS:
	    {
	    char    lpszFileTitle[MAX_PATH];
	    int     nResult;

	    // get a valid filename and path
	    if (SaveAsFileName (hWnd, lpszFileTitle, lpszFilePath))
		{
		// if file saves okay
		if ((nResult = SaveFile (hWnd, lpszFilePath)) > 0)
		    {
		    // reset changed flag, and window title
		    SendMessage (hWndEdit, EM_SETMODIFY, FALSE, 0);
		    SetWindowTitle (hWnd, lpszFileTitle);
		    SetWindowWord (hWnd, WW_UNTITLED, FALSE);
		    }
		else
		    {
		    // unable to save file, return error
		    ErrorNotify (hWnd, nResult);
		    return FALSE;
		    }
		}
	    else
		return FALSE;
	    }
	    break;

	case IDM_FILESAVE:
	    {
	    char    lpszFileTitle[MAX_PATH];
	    int     nResult;

	    // if called from menu, check to see if file modified
	    if (!lParam &&
		SendMessage (hWndEdit, EM_GETMODIFY, 0, 0))
		return FALSE;

	// user defined msg is sent from Exit, Open and New menuitems
	case UM_SAVEFILE:

	    // if untitled, get new name
	    if (GetWindowWord (hWnd, WW_UNTITLED) &&
		!(SaveAsFileName(hWnd, lpszFileTitle, lpszFilePath)))
		{
		// make sure no name was saved
		*lpszFilePath = 0;
		return FALSE;
		}

	    // save buffer and reset flag
	    if ((nResult = SaveFile (hWnd, lpszFilePath)) > 0)
		{
		// if new file name, set window title
		if (*lpszFileTitle)
		    {
		    SetWindowTitle (hWnd, lpszFileTitle);
		    SetWindowWord (hWnd, WW_UNTITLED, FALSE);
		    }
		SendMessage (hWndEdit, EM_SETMODIFY, FALSE, 0);
		}
	    else
		{
		// unable to save file, return error
		ErrorNotify (hWnd, nResult);
		return FALSE;
		}
	    }
	    break;

	case IDM_FILEPRINT:
	    {
	    int    nRes;

	    // print the file
	    if ((nRes = PrintFile (hWnd)) < 0)
		ErrorNotify (hWnd, nRes);
	    }
	    break;

	case IDM_FILESETUP:
	    {
	    int    nRes;

	    // set up the printer environment
	    if ((nRes = PrinterSetup (hWnd)) < 0)
		ErrorNotify (hWnd, nRes);
	    }
	    break;

	case IDM_FILEEXIT:
	    // exit application
	    PostMessage (hWnd, WM_CLOSE, 0, 0L);
	    break;

	case IDM_FILEABOUT:
	    // call about dialog box
	    DialogBox ((HANDLE)GetModuleHandle (NULL),
		       (LPSTR)IDD_ABOUT,
		       hWnd,
		       AboutDlgProc);
	    break;

#if EDIT_FIXED
	case IDM_EDITCOPY:
	case IDM_EDITCUT:
	case IDM_EDITCLEAR:
	    SendMessage (hWndEdit, uParam, 0, 0);
	    break;
#else
	case IDM_EDITCUT:
	case IDM_EDITCOPY:
	    {
	    HLOCAL    hEditData, hData;
	    char      *lpEditData, *lpData;
	    DWORD     BegSel, EndSel;

	    // get current selection
	    SendMessage (hWndEdit, EM_GETSEL, (UINT)&BegSel, (UINT)&EndSel);
	    hEditData = (HLOCAL)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0);
	    lpEditData = LocalLock (hEditData);

	    // allocate buffer to hold cipboard data
	    hData = LocalAlloc (LHND, EndSel-BegSel+1);
	    lpData = LocalLock (hData);
	    strncpy (lpData, lpEditData+BegSel, EndSel-BegSel);
	    lpData[EndSel-BegSel] = 0;

	    // copy data to clipboard
	    OpenClipboard (hWnd);
	    SetClipboardData (CF_TEXT, lpData);
	    CloseClipboard ();

	    // unlock memory and free
	    LocalUnlock (hEditData);
	    LocalUnlock (hData);
	    LocalFree (hData);
	    }

	    // if copying to clipboard, exit here
	    if (uParam == IDM_EDITCOPY)
		break;

	case IDM_EDITCLEAR:
	    // replace selection with null
	    SendMessage (hWndEdit, EM_REPLACESEL, 0, (UINT)"");
	    break;
#endif

	case IDM_EDITPASTE:
	    SendMessage (hWndEdit, uParam, 0, 0);
	    break;

	case IDM_EDITSELECT:
	    // 0, -1 selects the entire string
	    SendMessage (hWndEdit, EM_SETSEL, 0, (LONG)(int)-1);
	    break;

	case IDM_EDITUNDO:
	    SendMessage (hWndEdit, EM_UNDO, 0, 0);
	    break;

	case IDM_EDITSCROLL:
	    {
	    WORD    wScroll = !GetWindowWord (hWnd, WW_SCROLL);

	    // toggle vertical scroll bar
	    SetScrollRange (hWndEdit, SB_VERT, 0, (int)(wScroll ? 100 : 0), TRUE);

	    // if not word wrap, toggle horizontal scroll
	    if (ES_AUTOHSCROLL & GetWindowLong (hWndEdit, GWL_STYLE))
		SetScrollRange (hWndEdit, SB_HORZ, 0, (int)(wScroll ? 100 : 0), TRUE);

	    // set scroll flag
	    SetWindowWord (hWnd, WW_SCROLL, wScroll);
	    }
	    break;

	case IDM_EDITWRAP:
	    // change edit control
	    if ((nResult = SetWrap (hWnd)) < 0)
		// notify user of error
		ErrorNotify (hWnd, nResult);
	    break;

	case IDM_EDITFONT:
	    {
	    CHOOSEFONT	  cf;
	    LOGFONT	  lfEditFont;
	    HFONT	  hEditFont;
	    int 	  iSize;

	    // get logical font structure from current font
	    if (hEditFont = (HFONT)SendMessage (hWndEdit, WM_GETFONT, 0, 0))
		{
		GetObject (hEditFont, sizeof (lfEditFont), &lfEditFont);
		cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
		}
	    else
		cf.Flags = CF_SCREENFONTS;

	    // call common dialog to select a font
	    cf.lStructSize    = sizeof (CHOOSEFONT);
	    cf.hwndOwner      = hWnd;
	    cf.hDC	      = NULL;
	    cf.lpLogFont      = &lfEditFont;
	    cf.iPointSize     = iSize;
	    cf.rgbColors      = NULL;
	    cf.lCustData      = NULL;
	    cf.lpfnHook       = NULL;
	    cf.lpTemplateName = NULL;
	    cf.hInstance      = NULL;
	    cf.lpszStyle      = NULL;
	    cf.nFontType      = SCREEN_FONTTYPE;
	    cf.nSizeMin       = NULL;
	    cf.nSizeMax       = NULL;

	    if (ChooseFont (&cf))
		{
		// create new font and put in edit control
		SendMessage (hWndEdit,
			     WM_SETFONT,
			     (UINT)CreateFontIndirect
			     (&lfEditFont),
			     TRUE);

		if (hEditFont)
		    DeleteObject (hEditFont);
		}
	    }
	    break;

	case IDM_SEARCHFIND:
	    {
	    UINT    uBegSel, uEndSel;
	    WORD    wCase = GetWindowWord (hWnd, WW_SEARCHCASE);
	    WORD    wDir = GetWindowWord (hWnd, WW_SEARCHDN);

	    // if selected text, replace global search string
	    SendMessage (hWndEdit, EM_GETSEL, (UINT)&uBegSel, (UINT)&uEndSel);
	    if (uBegSel != uEndSel)
		GetEditSubString (hWndEdit, &uBegSel, &uEndSel, lpszSearch);

	    // Put up the find dialog box
	    if (!FindDialog (hWnd, wCase, wDir, lpszSearch))
		ErrorNotify (hWnd, IDS_SEARCHDLGFAILED);
	    }
	    break;

	case IDM_SEARCHNEXT:
	    // locate next search string in edit control
	    if (!LocateText (hWnd,
			     GetWindowWord (hWnd, WW_SEARCHCASE),
			     TRUE,
			     lpszSearch))
		ErrorNotify (hWnd, IDS_STRINGNOTFOUND);
	    break;

	case IDM_SEARCHPREV:
	    // locate previous search string in edit control
	    if (!LocateText (hWnd,
			     GetWindowWord (hWnd, WW_SEARCHCASE),
			     FALSE,
			     lpszSearch))
		ErrorNotify (hWnd, IDS_STRINGNOTFOUND);
            break;

	case IDM_PORTCURFILE:
	    // if untitled, save first
	    if (GetWindowWord (hWnd, WW_UNTITLED) &&
		!SendMessage (hWnd, WM_COMMAND, IDM_FILEOPEN, 0))
		{
		ErrorNotify (hWnd, IDS_NOFILETOPORT);
		break;
		}

	    // start port dialog with flags
	    hDlgPort = CreateDialog (GetModuleHandle (NULL),
				     IDD_PORTDIALOG,
				     hWnd,
				     PortDlgProc);
	    break;

	case IDM_PORTBKGND:
	    if (IsWindow (hDlgPortStatus))
		ShowWindow (hDlgPortStatus, SW_SHOWNORMAL);
	    else if (!(hDlgPortStatus = StartBackground (GetModuleHandle (NULL),
							 hWnd,
							 NULL)))
		ErrorNotify (hWnd, IDS_BKPORTSTARTFAILED);
	    break;
	}
    return TRUE;
}



// change the word wrapping in an edit control
int WINAPI SetWrap (
    HWND    hWnd)

{
    DWORD   dwStyle;
    HANDLE  hOldData, hNewData;
    char    *lpOldData, *lpNewData;
    HWND    hWndOld = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
    HWND    hWndNew;
    RECT    rc;
    UINT    uLen;
    UINT    uBegSel, uEndSel;
    WORD    wScroll = GetWindowWord (hWnd, WW_SCROLL);
    HFONT   hEditFont = (HFONT)SendMessage (hWndOld, WM_GETFONT, 0, 0);


    // turn off scroll bars if currently present
    if (wScroll)
	{
	SetScrollRange (hWndOld, SB_VERT, 0, 0, FALSE);
	SetScrollRange (hWndOld, SB_HORZ, 0, 0, FALSE);
	}

    // new edit style = old style XOR ES_AUTOHSCROLL
    dwStyle = ES_AUTOHSCROLL ^ (DWORD)GetWindowLong (hWndOld, GWL_STYLE);

    // save text selection
    SendMessage (hWndOld, EM_GETSEL, (UINT)&uBegSel, (UINT)&uEndSel);

    // create a new edit control with the new style
    GetClientRect (hWnd, &rc);
    hWndNew = CreateWindow ("edit",
			    "",
			    dwStyle,
			    rc.left,
			    rc.top,
			    rc.right-rc.left,
			    rc.bottom-rc.top,
			    hWnd,
			    (HMENU)IDC_EDIT,
			    (HANDLE)GetModuleHandle (NULL),
			    0);

    // check for window created
    if (!IsWindow (hWndNew))
	return IDS_EDITWNDFAILED;

    // reset to no format lines
    SendMessage (hWndOld, EM_FMTLINES, !(dwStyle & ES_AUTOHSCROLL), 0);

    // get the data handle of the old control
    if (!(hOldData = (HANDLE)SendMessage (hWndOld, EM_GETHANDLE, 0, 0)))
	{
	// delete new edit window and return error
	DestroyWindow (hWndNew);
	return IDS_GETHANDLEFAILED;
	}

    // get data handle to new edit control and reallocate to size of old edit text
    hNewData = (HANDLE)SendMessage (hWndNew, EM_GETHANDLE, 0, 0);
    uLen = GetWindowTextLength (hWndOld);
    if (LocalReAlloc(hNewData, uLen+1, LHND) == NULL)
	{
	// abort, clean up and return error
	DestroyWindow (hWndNew);
	return IDS_REALLOCFAILED;
	}

    lpOldData = LocalLock (hOldData);
    lpNewData = LocalLock (hNewData);
    lpNewData[uLen+1] = 0;

    // copy from one buffer to the other
    while (uLen-- > 0)
	lpNewData[uLen] = lpOldData[uLen];

    // unlock and release data buffers
    LocalUnlock (hOldData);
    LocalUnlock (hNewData);

    // swap windows
    SetWindowLong (hWnd, WL_HWNDEDIT, (LONG)hWndNew);
    DestroyWindow (hWndOld);
    SendMessage (hWndNew, EM_SETHANDLE, (UINT)hNewData, 0);

    // set line formatting
    SendMessage (hWndNew, EM_FMTLINES, !(dwStyle & ES_AUTOHSCROLL), 0);

    // replace font in new edit control
    if (hEditFont)
	SendMessage (hWndNew, WM_SETFONT, (UINT)hEditFont, 0);

    // set scroll bars if appropriate
    if (wScroll)
	{
	SetScrollRange (hWndNew, SB_VERT, 0, 100, TRUE);
	SetScrollRange (hWndNew, SB_HORZ, 0, (ES_AUTOHSCROLL & dwStyle ? 100 : 0), TRUE);
	}

    // restore text selection, repaint and set focus
    InvalidateRect (hWndNew, NULL, TRUE);
    UpdateWindow (hWndNew);
    SendMessage (hWndNew, EM_SETSEL, uBegSel, uEndSel);
    SetFocus (hWndNew);

    // return success
    return TRUE;
}



// get win32 command line parameters
BOOL WINAPI GetCmdLine(
    char    *lpStr,
    char    *lpszCmdLine,
    BOOL    *bBkgnd)
{
    if (*lpStr)
	{
	// skip application name which precedes parameters
	while (*lpStr != ' ' && *lpStr != 0)
	    lpStr++;

	// skip spaces
	while (*lpStr == ' ' && *lpStr != 0)
	    lpStr++;

	// indeed command line parameter(s) present
	if (*lpStr != 0)
	    {
	    // if background switch, set flag and remove switch from command line
	    if ((*lpStr == '/' || *lpStr == '-') &&
		(*(lpStr+1) == 'b' || *(lpStr+1) == 'B'))
		{
		*bBkgnd = TRUE;
		lpStr += 2;

		if (*lpStr == 0)
		    *lpszCmdLine = 0;
		else
		    strcpy (lpszCmdLine, lpStr);
		}
	    // maybe switch is embedded in parameter(s) somewhere
	    else
		{
		char	*pStr = lpStr;
		char	*pCmdLine = lpszCmdLine;
		int	i, nCnt;

		while (*pStr != 0)
		    {
		    // background switch is set, so prepare parameters and set flag
		    if ((*pStr == '/' || *pStr == '-') &&
			(*(pStr+1) == 'b' || *(pStr+1) == 'B'))
			{
			*bBkgnd = TRUE;

			// copy from beg. of lpStr to *pStr to lpszCmdLine
			nCnt = pStr - lpStr;
			for (i=0; i<nCnt; i++)
			    lpszCmdLine[i] = lpStr[i];
			lpszCmdLine[i] = 0;
			strcat (lpszCmdLine, (pStr+2));

			// break from loop
			break;
			}

		    pStr++;
		    }

		// no switch found, can only edit one file, remove extra parameters
		if (*pStr == 0)
		    {
		    pStr = lpStr;

		    while (*pStr != ' ' && *pStr != 0)
			pStr++;

		    if (*pStr == ' ')
			*pStr = 0;

		    strcpy (lpszCmdLine, lpStr);
		    }
		}
	    }
	else
	    return FALSE;
	}
    else
	return FALSE;

    return TRUE;
}



// display a Save, Yes|No|Cancel message box
int WINAPI Save_YNC (
    HWND    hWnd)
{
    char    lpszMsg[MAX_PATH];
    char    lpszAppName[MAX_PATH];

    // load string to prompt user
    LoadString ((HANDLE)GetModuleHandle (NULL),
		IDS_DATACHANGED,
		lpszMsg,
		sizeof (lpszMsg));
    LoadString ((HANDLE)GetModuleHandle (NULL),
		IDS_APPNAME,
		lpszAppName,
		sizeof (lpszAppName));

    // return user response
    return (MessageBox (hWnd,
			lpszMsg,
			lpszAppName,
			MB_YESNOCANCEL | MB_ICONQUESTION));
}



// error notification routine
VOID WINAPI ErrorNotify (
    HWND    hWnd,
    int     nErrorString)
{
    char    lpszAppName[MAX_PATH];
    char    lpszErrStr[MAX_PATH];

    LoadString ((HANDLE)GetModuleHandle (NULL),
		IDS_APPNAME,
		lpszAppName,
		sizeof (lpszAppName));
    LoadString ((HANDLE)GetModuleHandle (NULL),
		nErrorString,
		lpszErrStr,
		sizeof (lpszErrStr));
    MessageBox (hWnd, lpszErrStr, lpszAppName, MB_OK | MB_ICONSTOP);
}



VOID WINAPI SetWindowTitle (
    HWND    hWnd,
    char    *lpszFile)
{
    char    lpszAppName[MAX_PATH];

    // load AppName and Window title string into window text
    LoadString ((HANDLE)GetModuleHandle (NULL),
		IDS_PRINTJOB,
		lpszAppName,
		sizeof (lpszAppName));
    strcat (lpszAppName, lpszFile);
    SetWindowText (hWnd, lpszAppName);
}



// extract a substring from the edit controls data buffer
VOID WINAPI GetEditSubString (
    HWND    hWndEdit,
    PUINT   puStart,
    PUINT   puEnd,
    char    *lpszString)
{
    HANDLE    hEditData;
    char      *lpEditData;
    UINT      i;

    // maximum search string length is MAXSEARCHSTRING characters
    if ((*puEnd - *puStart) > MAXSEARCHSTRING)
	*puEnd = *puStart + MAXSEARCHSTRING;

    // get edit data handle and lock
    hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0);
    lpEditData = (char *)LocalLock (hEditData);

    // copy characters to string and terminate
    for (i=*puStart; i<*puEnd; i++)
	lpszString[i-*puStart] = lpEditData[i];
    lpszString[i-*puStart] = 0;

    // unlock and return edit handle
    LocalUnlock (hEditData);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.