windows-nt/Source/XPSP1/NT/base/mvdm/wow16/user/edmlonce.c
2020-09-26 16:20:57 +08:00

180 lines
5.3 KiB
C

/*++
*
* WOW v1.0
*
* Copyright (c) 1991, Microsoft Corporation
*
* EDMLONCE.C
* Win16 edit control code
*
* History:
*
* Created 28-May-1991 by Jeff Parsons (jeffpar)
* Copied from WIN31 and edited (as little as possible) for WOW16.
--*/
/****************************************************************************/
/* edmlonce.c - Edit controls Routines Called just once or twice are to be */
/* put in a seperate segment _EDMLONCE. This file contains */
/* these routines. */
/* */
/* */
/* Created: 02-08-89 sankar */
/****************************************************************************/
#define NO_LOCALOBJ_TAGS
#include "user.h"
#include "edit.h"
/****************************************************************************/
/* Multi-Line Support Routines called just once */
/****************************************************************************/
void FAR PASCAL MLSizeHandler(ped)
register PED ped;
/* effects: Handles sizing of the edit control window and properly updating
* the fields that are dependent on the size of the control. ie. text
* characters visible etc.
*/
{
RECT rc;
GetClientRect(ped->hwnd, (LPRECT)&rc);
MLSetRectHandler(ped, (LPRECT)&rc);
GetWindowRect(ped->hwnd, (LPRECT)&rc);
ScreenToClient(ped->hwnd, (LPPOINT)&rc.left);
ScreenToClient(ped->hwnd, (LPPOINT)&rc.right);
InvalidateRect(ped->hwnd, (LPRECT) &rc, TRUE);
/*UpdateWindow(ped->hwnd);*/
}
BOOL FAR PASCAL MLSetTextHandler(ped, lpstr)
register PED ped;
LPSTR lpstr;
/* effects: Copies the null terminated text in lpstr to the ped. Notifies the
* parent if there isn't enough memory. Returns TRUE if successful else FALSE
* if memory error.
*/
{
BOOL fInsertSuccessful;
/* Set the text and update the window if text was added */
fInsertSuccessful = ECSetText(ped, lpstr);
if (fInsertSuccessful)
{
MLStripCrCrLf(ped);
/* Always build lines even if no text was inserted. */
MLBuildchLines(ped, 0, 0, FALSE);
/* Reset caret and selections since the text could have changed */
ped->screenStart = ped->ichMinSel = ped->ichMaxSel = 0;
ped->ichCaret = 0;
ped->xOffset = 0;
ped->iCaretLine = 0;
ped->fDirty = FALSE;
}
ECEmptyUndo(ped);
SetScrollPos(ped->hwnd, SB_VERT, 0, TRUE);
SetScrollPos(ped->hwnd, SB_HORZ, 0, TRUE);
/* We will always redraw the text whether or not the insert was successful
* since we may set to null text. Since PaintHandler checks the redraw flag,
* we won't bother to check it here.
*/
InvalidateRect(ped->hwnd, (LPRECT)NULL, TRUE);
/* Need to do the updatewindow to keep raid happy.*/
UpdateWindow(ped->hwnd);
return(fInsertSuccessful);
}
LONG FAR PASCAL MLCreateHandler(hwnd, ped, lpCreateStruct)
HWND hwnd;
register PED ped;
LPCREATESTRUCT lpCreateStruct;
/* effects: Creates the edit control for the window hwnd by allocating memory
* as required from the application's heap. Notifies parent if no memory
* error (after cleaning up if needed). Returns TRUE if no error else returns
* -1.
*/
{
LONG windowStyle;
LPSTR lpWindowText=lpCreateStruct->lpszName;
RECT rc;
/* Save the text across the local allocs in ECNcCreate */
SwapHandle(&lpWindowText);
/* Do the standard creation stuff */
if (!ECCreate(hwnd, ped, lpCreateStruct))
return(-1);
/* Allocate line start array as a fixed block in local heap */
if (!(ped->chLines = (int *)LocalAlloc(LPTR,2*sizeof(int))))
return(-1);
/* Call it one line of text... */
ped->cLines = 1;
/* Get values from the window instance data structure and put them in the
* ped so that we can access them easier
*/
windowStyle = GetWindowLong(hwnd, GWL_STYLE);
/* If app wants WS_VSCROLL or WS_HSCROLL, it automatically gets AutoVScroll
* or AutoHScroll.
*/
if ((windowStyle & ES_AUTOVSCROLL) || (windowStyle & WS_VSCROLL))
ped->fAutoVScroll = 1;
ped->format = (LOWORD(windowStyle) & LOWORD(ES_FMTMASK));
if (ped->format != ES_LEFT)
{
/* If user wants right or center justified text, then we turn off
* AUTOHSCROLL and WS_HSCROLL since non-left styles don't make sense
* otherwise.
*/
windowStyle = windowStyle & ~WS_HSCROLL;
SetWindowLong(hwnd, GWL_STYLE, windowStyle);
ped->fAutoHScroll = FALSE;
}
if (windowStyle & WS_HSCROLL)
ped->fAutoHScroll = 1;
ped->fWrap = (!ped->fAutoHScroll && !(windowStyle & WS_HSCROLL));
ped->fSingle = FALSE; /* Set multi line edit control */
_asm int 3
ped->cchTextMax = MAXTEXT; /* Max # chars we will allow user to enter */
/* Set the default font to be the system font.
*/
ECSetFont(ped, NULL, FALSE);
SetRect((LPRECT)&rc, 0, 0, ped->aveCharWidth*10, ped->lineHeight);
MLSetRectHandler(ped, (LPRECT)&rc);
/* Set the window text if needed and notify parent if not enough memory to
* set the initial text.
*/
/* Restore the text from the save we did at the beginning */
SwapHandle(&lpWindowText);
if (lpWindowText && !MLSetTextHandler(ped, lpWindowText))
return(-1);
return(TRUE);
}