322 lines
14 KiB
C
322 lines
14 KiB
C
/*++ BUILD Version: 0001
|
|
*
|
|
* WOW v1.0
|
|
*
|
|
* Copyright (c) 1991, Microsoft Corporation
|
|
*
|
|
* EDIT.H
|
|
*
|
|
* History:
|
|
* Created 28-May-1991 by Jeff Parsons (jeffpar)
|
|
* Copied from WIN31 and edited (as little as possible) for WOW16
|
|
--*/
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* EDIT.H - */
|
|
/* */
|
|
/* Edit Control Defines and Procedures */
|
|
/* */
|
|
/****************************************************************************/
|
|
#include "combcom.h"
|
|
|
|
/* NOTE: Text handle is sized as multiple of this constant
|
|
* (should be power of 2).
|
|
*/
|
|
#define CCHALLOCEXTRA 0x20
|
|
|
|
/* Maximum width in pixels for a line/rectangle */
|
|
#define MAXPIXELWIDTH 30000
|
|
|
|
/* Limit multiline edit controls to at most 1024 characters on a single line.
|
|
* We will force a wrap if the user exceeds this limit.
|
|
*/
|
|
#define MAXLINELENGTH 1024
|
|
|
|
#define ES_FMTMASK 0x00000003L
|
|
|
|
/* Allow an initial maximum of 30000 characters in all edit controls since
|
|
* some apps will run into unsigned problems otherwise. If apps know about
|
|
* the 64K limit, they can set the limit themselves.
|
|
*/
|
|
#define MAXTEXT 30000
|
|
|
|
#define BACKSPACE 0x08
|
|
#define TAB 0x09
|
|
|
|
/* Key modifiers which have been pressed. Code in KeyDownHandler and
|
|
CharHandler depend on these exact values. */
|
|
#define NONEDOWN 0 /* Neither shift nor control down */
|
|
#define CTRLDOWN 1 /* Control key only down */
|
|
#define SHFTDOWN 2 /* Shift key only down */
|
|
#define SHCTDOWN 3 /* Shift and control keys down = CTRLDOWN + SHFTDOWN */
|
|
#define NOMODIFY 4 /* Neither shift nor control down */
|
|
|
|
/* Types of undo supported in this ped */
|
|
#define UNDO_NONE 0 /* We can't undo the last operation. */
|
|
#define UNDO_INSERT 1 /* We can undo the user's insertion of characters */
|
|
#define UNDO_DELETE 2 /* We can undo the user's deletion of characters */
|
|
|
|
typedef struct tagED
|
|
{
|
|
HANDLE hText; /* Block of text we are editing */
|
|
ICH cchAlloc; /* Number of chars we have allocated for hText
|
|
*/
|
|
ICH cchTextMax; /* Max number bytes allowed in edit control
|
|
*/
|
|
ICH cch; /* Current number of bytes of actual text
|
|
*/
|
|
int cLines; /* Number of lines of text */
|
|
|
|
ICH ichMinSel; /* Selection extent. MinSel is first selected
|
|
char */
|
|
ICH ichMaxSel; /* MaxSel is first unselected character */
|
|
ICH ichCaret; /* Caret location. Caret is on left side of
|
|
char */
|
|
int iCaretLine; /* The line the caret is on. So that if word
|
|
* wrapping, we can tell if the caret is at end
|
|
* of a line of at beginning of next line...
|
|
*/
|
|
ICH screenStart; /* Index of left most character displayed on
|
|
* screen for sl ec and index of top most line
|
|
* for multiline edit controls
|
|
*/
|
|
int ichLinesOnScreen; /* Number of lines we can display on screen */
|
|
WORD xOffset; /* x (horizontal) scroll position in pixels
|
|
* (for multiline text horizontal scroll bar)
|
|
*/
|
|
WORD charPasswordChar; /* If non null, display this character instead
|
|
* of the real text. So that we can implement
|
|
* hidden text fields.
|
|
*/
|
|
WORD cPasswordCharWidth;/* Width of password char */
|
|
|
|
HWND hwnd; /* Window for this edit control */
|
|
RECT rcFmt; /* Client rectangle */
|
|
HWND hwndParent; /* Parent of this edit control window */
|
|
|
|
/* These vars allow us to automatically scroll
|
|
* when the user holds the mouse at the bottom
|
|
* of the multiline edit control window.
|
|
*/
|
|
POINT ptPrevMouse; /* Previous point for the mouse for system
|
|
* timer.
|
|
*/
|
|
WORD prevKeys; /* Previous key state for the mouse */
|
|
|
|
|
|
WORD fSingle : 1; /* Single line edit control? (or multiline) */
|
|
WORD fNoRedraw : 1; /* Redraw in response to a change? */
|
|
WORD fMouseDown : 1; /* Is mouse button down? when moving mouse */
|
|
WORD fFocus : 1; /* Does ec have the focus ? */
|
|
WORD fDirty : 1; /* Modify flag for the edit control */
|
|
WORD fDisabled : 1; /* Window disabled? */
|
|
WORD fNonPropFont : 1; /* Fixed width font? */
|
|
WORD fBorder : 1; /* Draw a border? */
|
|
WORD fAutoVScroll : 1; /* Automatically scroll vertically */
|
|
WORD fAutoHScroll : 1; /* Automatically scroll horizontally */
|
|
WORD fNoHideSel : 1; /* Hide sel when we lose focus? */
|
|
#ifdef FE_SB
|
|
WORD fDBCS : 1; /* Are we use DBCS font set for editing? */
|
|
#else
|
|
WORD fKanji : 1;
|
|
#endif
|
|
WORD fFmtLines : 1; /* For multiline only. Do we insert CR CR LF at
|
|
* word wrap breaks?
|
|
*/
|
|
WORD fWrap : 1; /* Do word wrapping? */
|
|
WORD fCalcLines : 1; /* Recalc ped->chLines array? (recalc line
|
|
* breaks?)
|
|
*/
|
|
WORD fEatNextChar : 1; /* Hack for ALT-NUMPAD stuff with combo boxes.
|
|
* If numlock is up, we want to eat the next
|
|
* character generated by the keyboard driver
|
|
* if user enter num pad ascii value...
|
|
*/
|
|
WORD fStripCRCRLF :1; /* CRCRLFs have been added to text. Strip them
|
|
* before doing any internal edit control
|
|
* stuff
|
|
*/
|
|
WORD fInDialogBox :1; /* True if the ml edit control is in a dialog
|
|
* box and we have to specially treat TABS and
|
|
* ENTER
|
|
*/
|
|
WORD fReadOnly :1; /* Is this a read only edit control? Only
|
|
* allow scrolling, selecting and copying.
|
|
*/
|
|
WORD fCaretHidden :1; /* This indicates whether the caret is
|
|
* currently hidden because the width or height
|
|
* of the edit control is too small to show it.
|
|
*/
|
|
int *chLines; /* index of the start of each line */
|
|
WORD format; /* Left, center, or right justify multiline
|
|
* text.
|
|
*/
|
|
LPSTR (FAR *lpfnNextWord)(); /* Next word function */
|
|
ICH maxPixelWidth; /* Width (in pixels) of longest line */
|
|
|
|
WORD undoType; /* Current type of undo we support */
|
|
HANDLE hDeletedText; /* Handle to text which has been deleted (for
|
|
undo)
|
|
*/
|
|
ICH ichDeleted; /* Starting index from which text was deleted*/
|
|
ICH cchDeleted; /* Count of deleted characters in buffer */
|
|
ICH ichInsStart; /* Starting index from which text was
|
|
inserted */
|
|
ICH ichInsEnd; /* Ending index of inserted text */
|
|
|
|
|
|
HANDLE hFont; /* Handle to the font for this edit control.
|
|
Null if system font.
|
|
*/
|
|
int aveCharWidth; /* Ave width of a character in the hFont */
|
|
int lineHeight; /* Height of a line in the hFont */
|
|
int charOverhang; /* Overhang associated with the hFont */
|
|
int cxSysCharWidth; /* System font ave width */
|
|
int cySysCharHeight; /* System font height */
|
|
HWND listboxHwnd; /* ListBox hwnd. Non null if we are a combo
|
|
box */
|
|
int *pTabStops; /* Points to an array of tab stops; First
|
|
* element contains the number of elements in
|
|
* the array
|
|
*/
|
|
HANDLE charWidthBuffer;
|
|
HBRUSH hbrHiliteBk; /* Hilite background color brush. */
|
|
DWORD rgbHiliteBk; /* Hilite background color */
|
|
DWORD rgbHiliteText; /* Hilite Text color */
|
|
#ifdef FE_SB
|
|
BYTE charSet; /* Character set for current selected font */
|
|
HANDLE hDBCSVector; /* Handle to the DBCS vector table */
|
|
BYTE DBCSVector[8]; /* DBCS vector table which contains flag
|
|
* to detect lead byte of DBC.
|
|
*/
|
|
#endif
|
|
} ED;
|
|
|
|
typedef ED *PED;
|
|
|
|
|
|
/* The following structure is used to store a selection block; In Multiline
|
|
* edit controls, "StPos" and "EndPos" fields contain the Starting and Ending
|
|
* lines of the block. In Single line edit controls, "StPos" and "EndPos"
|
|
* contain the Starting and Ending character positions of the block;
|
|
*/
|
|
typedef struct tagBLOCK
|
|
{
|
|
ICH StPos;
|
|
ICH EndPos;
|
|
} BLOCK;
|
|
typedef BLOCK FAR *LPBLOCK;
|
|
|
|
|
|
|
|
BOOL FAR PASCAL ECNcCreate(HWND, LPCREATESTRUCT);
|
|
BOOL FAR PASCAL ECCreate(HWND, PED, LPCREATESTRUCT);
|
|
LONG FAR PASCAL ECWord(PED, ICH, BOOL); /* no register for PED */
|
|
ICH FAR PASCAL ECFindTab(LPSTR, register ICH);
|
|
void FAR PASCAL ECNcDestroyHandler(HWND, register PED, WORD, LONG);
|
|
BOOL FAR PASCAL ECSetText(register PED, LPSTR);
|
|
void FAR PASCAL ECSetPasswordChar(register PED, WORD);
|
|
ICH FAR PASCAL ECCchInWidth(register PED, HDC, LPSTR, register ICH, unsigned int);
|
|
void FAR PASCAL ECEmptyUndo(register PED);
|
|
BOOL FAR PASCAL ECInsertText(register PED, LPSTR, ICH);
|
|
ICH FAR PASCAL ECDeleteText(register PED);
|
|
void FAR PASCAL ECNotifyParent(register PED, short);
|
|
void FAR PASCAL ECSetEditClip(register PED, HDC);
|
|
HDC FAR PASCAL ECGetEditDC(register PED, BOOL);
|
|
void FAR PASCAL ECReleaseEditDC(register PED, HDC, BOOL);
|
|
void FAR PASCAL ECCreateHandler(register PED);
|
|
ICH FAR PASCAL ECGetTextHandler(register PED, register ICH, LPSTR);
|
|
void FAR PASCAL ECSetFont(register PED, HANDLE, BOOL);
|
|
ICH FAR PASCAL ECCopyHandler(register PED);
|
|
BOOL FAR PASCAL ECCalcChangeSelection(PED, ICH, ICH, LPBLOCK, LPBLOCK);
|
|
void NEAR PASCAL ECFindXORblks(LPBLOCK, LPBLOCK, LPBLOCK, LPBLOCK);
|
|
LONG FAR PASCAL ECTabTheTextOut(HDC, int, int, LPSTR, int, PED, int, BOOL);
|
|
|
|
/****************************************************************************/
|
|
/* Multi-Line Support Routines */
|
|
/****************************************************************************/
|
|
|
|
ICH FAR PASCAL MLInsertText(PED, LPSTR, WORD, BOOL);
|
|
BOOL FAR PASCAL MLEnsureCaretVisible(register PED);
|
|
void NEAR PASCAL MLDrawText(register PED, HDC, ICH, ICH);
|
|
void NEAR PASCAL MLDrawLine(register PED, HDC, int, ICH, int, BOOL);
|
|
void NEAR PASCAL MLPaintABlock(PED, HDC, int, int);
|
|
int NEAR PASCAL GetBlkEndLine(int, int, BOOL FAR *, int, int);
|
|
LONG FAR PASCAL MLBuildchLines(register PED, int, int, BOOL);
|
|
void NEAR PASCAL MLShiftchLines(register PED, register int, int);
|
|
BOOL NEAR PASCAL MLInsertchLine(register PED, int, ICH, BOOL);
|
|
void FAR PASCAL MLSetCaretPosition(register PED,HDC);
|
|
LONG NEAR PASCAL MLIchToXYPos(register PED, HDC, ICH, BOOL);
|
|
int FAR PASCAL MLIchToLineHandler(register PED, ICH);
|
|
void NEAR PASCAL MLRepaintChangedSelection(PED, HDC, ICH, ICH);
|
|
void NEAR PASCAL MLMouseMotionHandler(PED, WORD, WORD, POINT);
|
|
ICH FAR PASCAL MLLineLength(register PED, int);
|
|
void FAR PASCAL MLStripCrCrLf(register PED);
|
|
BOOL FAR PASCAL MLSetTextHandler(register PED, LPSTR);
|
|
int FAR PASCAL MLCalcXOffset(register PED, HDC, int);
|
|
BOOL FAR PASCAL MLUndoHandler(register PED);
|
|
LONG FAR PASCAL MLEditWndProc(HWND, register PED, WORD, register WORD, LONG);
|
|
void FAR PASCAL MLCharHandler(PED, WORD, int);
|
|
void FAR PASCAL MLSetSelectionHandler(register PED, ICH, ICH);
|
|
LONG FAR PASCAL MLCreateHandler(HWND, PED, LPCREATESTRUCT);
|
|
BOOL FAR PASCAL MLInsertCrCrLf(register PED);
|
|
void FAR PASCAL MLSetHandleHandler(register PED, HANDLE);
|
|
LONG FAR PASCAL MLGetLineHandler(register PED, WORD, ICH, LPSTR);
|
|
ICH FAR PASCAL MLLineIndexHandler(register PED, register int);
|
|
ICH FAR PASCAL MLLineLengthHandler(register PED, ICH);
|
|
void FAR PASCAL MLSizeHandler(register PED);
|
|
void FAR PASCAL MLChangeSelection(register PED, HDC, ICH, ICH);
|
|
void FAR PASCAL MLSetRectHandler(register PED, LPRECT);
|
|
BOOL FAR PASCAL MLExpandTabs(register PED);
|
|
BOOL FAR PASCAL MLSetTabStops(PED, int, LPINT);
|
|
int FAR PASCAL MLThumbPosFromPed(register PED, BOOL);
|
|
|
|
/****************************************************************************/
|
|
/* Single Line Support Routines */
|
|
/****************************************************************************/
|
|
|
|
void NEAR PASCAL SLReplaceSelHandler(register PED, LPSTR);
|
|
BOOL FAR PASCAL SLUndoHandler(register PED);
|
|
void FAR PASCAL SLSetCaretPosition(register PED, HDC);
|
|
int NEAR PASCAL SLIchToLeftXPos(register PED, HDC, ICH);
|
|
void FAR PASCAL SLChangeSelection(register PED, HDC, ICH, ICH);
|
|
void NEAR PASCAL SLDrawText(register PED, register HDC, ICH);
|
|
void NEAR PASCAL SLDrawLine(register PED, register HDC, ICH, int, BOOL);
|
|
int NEAR PASCAL SLGetBlkEnd(PED, ICH, ICH, BOOL FAR *);
|
|
BOOL FAR PASCAL SLScrollText(register PED, HDC);
|
|
void FAR PASCAL SLSetSelectionHandler(register PED,ICH, ICH);
|
|
ICH FAR PASCAL SLInsertText(register PED, LPSTR, register ICH);
|
|
ICH NEAR PASCAL SLPasteText(register PED);
|
|
void FAR PASCAL SLCharHandler(register PED, WORD, int);
|
|
void NEAR PASCAL SLKeyUpHandler(register PED, WORD);
|
|
void NEAR PASCAL SLKeyDownHandler(register PED, WORD, int);
|
|
ICH NEAR PASCAL SLMouseToIch(register PED, HDC, POINT);
|
|
void NEAR PASCAL SLMouseMotionHandler(register PED, WORD, WORD, POINT);
|
|
LONG FAR PASCAL SLCreateHandler(HWND, PED, LPCREATESTRUCT);
|
|
void FAR PASCAL SLSizeHandler(register PED);
|
|
void NEAR PASCAL SLPaintHandler(register PED, HDC);
|
|
BOOL FAR PASCAL SLSetTextHandler(register PED, LPSTR);
|
|
void NEAR PASCAL SLSetFocusHandler(register PED);
|
|
void NEAR PASCAL SLKillFocusHandler(register PED, HWND);
|
|
LONG FAR PASCAL SLEditWndProc(HWND, register PED, WORD, register WORD, LONG);
|
|
|
|
|
|
/****************************************************************************/
|
|
/* EditWndProc() */
|
|
/****************************************************************************/
|
|
LONG FAR PASCAL EditWndProc(HWND, WORD, register WORD, LONG);
|
|
|
|
|
|
#ifdef FE_SB
|
|
/****************************************************************************/
|
|
/* DBCS Support Routines */
|
|
/****************************************************************************/
|
|
int FAR PASCAL DBCSCombine( HWND, int );
|
|
ICH FAR PASCAL ECAdjustIch( PED, LPSTR, ICH );
|
|
VOID FAR PASCAL ECGetDBCSVector( PED );
|
|
LPSTR FAR PASCAL ECAnsiNext( PED, LPSTR );
|
|
LPSTR FAR PASCAL ECAnsiPrev( PED, LPSTR, LPSTR );
|
|
BOOL FAR PASCAL ECIsDBCSLeadByte( PED, BYTE );
|
|
#endif
|