You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
5.5 KiB
188 lines
5.5 KiB
/****************************************************************************\
|
|
* edslRare.c - SL Edit controls Routines Called rarely are to be
|
|
* put in a seperate segment _EDSLRare. This file contains
|
|
* these routines.
|
|
*
|
|
* Copyright (c) 1985 - 1999, Microsoft Corporation
|
|
*
|
|
* Single-Line Support Routines called Rarely
|
|
*
|
|
* Created: 02-08-89 sankar
|
|
\****************************************************************************/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
/***************************************************************************\
|
|
* SLCreate
|
|
*
|
|
* 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 return s
|
|
* -1.
|
|
*
|
|
* History:
|
|
\***************************************************************************/
|
|
|
|
LONG SLCreate(
|
|
PED ped,
|
|
LPCREATESTRUCT lpCreateStruct) //!!! CREATESTRUCT AorW and in other routines
|
|
{
|
|
LPSTR lpWindowText;
|
|
LONG windowStyle = ped->pwnd->style;
|
|
|
|
/*
|
|
* Do the standard creation stuff
|
|
*/
|
|
if (!ECCreate(ped, windowStyle))
|
|
return (-1);
|
|
|
|
/*
|
|
* Single lines always have no undo and 1 line
|
|
*/
|
|
ped->cLines = 1;
|
|
ped->undoType = UNDO_NONE;
|
|
|
|
/*
|
|
* Check if this edit control is part of a combobox and get a pointer to the
|
|
* combobox structure.
|
|
*/
|
|
if (windowStyle & ES_COMBOBOX)
|
|
ped->listboxHwnd = GetDlgItem(lpCreateStruct->hwndParent, CBLISTBOXID);
|
|
|
|
/*
|
|
* Set the default font to be the system font.
|
|
*/
|
|
ECSetFont(ped, NULL, FALSE);
|
|
|
|
/*
|
|
* Set the window text if needed. Return false if we can't set the text
|
|
* SLSetText notifies the parent in case there is a no memory error.
|
|
*/
|
|
if ((ULONG_PTR)lpCreateStruct->lpszName > gHighestUserAddress)
|
|
lpWindowText = REBASEPTR(ped->pwnd, (PVOID)lpCreateStruct->lpszName);
|
|
else
|
|
lpWindowText = (LPSTR)lpCreateStruct->lpszName;
|
|
|
|
if ((lpWindowText != NULL)
|
|
&& !IsEmptyString(lpWindowText, ped->fAnsi)
|
|
&& !ECSetText(ped, lpWindowText)) {
|
|
return (-1);
|
|
}
|
|
|
|
if (windowStyle & ES_PASSWORD)
|
|
ECSetPasswordChar(ped, (UINT)'*');
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/***************************************************************************\
|
|
* SLUndoHandler AorW
|
|
*
|
|
* Handles UNDO for single line edit controls.
|
|
*
|
|
* History:
|
|
\***************************************************************************/
|
|
|
|
BOOL SLUndo(
|
|
PED ped)
|
|
{
|
|
PBYTE hDeletedText = ped->hDeletedText;
|
|
BOOL fDelete = (BOOL)(ped->undoType & UNDO_DELETE);
|
|
ICH cchDeleted = ped->cchDeleted;
|
|
ICH ichDeleted = ped->ichDeleted;
|
|
BOOL fUpdate = FALSE;
|
|
|
|
if (ped->undoType == UNDO_NONE) {
|
|
|
|
/*
|
|
* No undo...
|
|
*/
|
|
return FALSE;
|
|
}
|
|
|
|
ped->hDeletedText = NULL;
|
|
ped->cchDeleted = 0;
|
|
ped->ichDeleted = (ICH)-1;
|
|
ped->undoType &= ~UNDO_DELETE;
|
|
|
|
if (ped->undoType == UNDO_INSERT) {
|
|
ped->undoType = UNDO_NONE;
|
|
|
|
/*
|
|
* Set the selection to the inserted text
|
|
*/
|
|
SLSetSelection(ped, ped->ichInsStart, ped->ichInsEnd);
|
|
ped->ichInsStart = ped->ichInsEnd = (ICH)-1;
|
|
|
|
#ifdef NEVER
|
|
|
|
/*
|
|
* Now send a backspace to deleted and save it in the undo buffer...
|
|
*/
|
|
SLCharHandler(pped, VK_BACK);
|
|
fUpdate = TRUE;
|
|
#else
|
|
|
|
/*
|
|
* Delete the selected text and save it in undo buff.
|
|
* Call ECDeleteText() instead of sending a VK_BACK message
|
|
* which results in an EN_UPDATE notification send even before
|
|
* we insert the deleted chars. This results in Bug #6610.
|
|
* Fix for Bug #6610 -- SANKAR -- 04/19/91 --
|
|
*/
|
|
if (ECDeleteText(ped)) {
|
|
|
|
/*
|
|
* Text was deleted -- flag for update and clear selection
|
|
*/
|
|
fUpdate = TRUE;
|
|
SLSetSelection(ped, ichDeleted, ichDeleted);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
if (fDelete) {
|
|
HWND hwndSave = ped->hwnd; // Used for validation.
|
|
|
|
/*
|
|
* Insert deleted chars. Set the selection to the inserted text.
|
|
*/
|
|
SLSetSelection(ped, ichDeleted, ichDeleted);
|
|
SLInsertText(ped, hDeletedText, cchDeleted);
|
|
UserGlobalFree(hDeletedText);
|
|
if (!IsWindow(hwndSave))
|
|
return FALSE;
|
|
SLSetSelection(ped, ichDeleted, ichDeleted + cchDeleted);
|
|
fUpdate = TRUE;
|
|
}
|
|
|
|
if (fUpdate) {
|
|
/*
|
|
* If we have something to update, send EN_UPDATE before and
|
|
* EN_CHANGE after the actual update.
|
|
* A part of the fix for Bug #6610 -- SANKAR -- 04/19/91 --
|
|
*/
|
|
ECNotifyParent(ped, EN_UPDATE);
|
|
|
|
if (FChildVisible(ped->hwnd)) {
|
|
// JimA changed this to ECInvalidateClient(ped, FALSE) Nov 1994
|
|
// GetClientRect(ped->hwnd, &rcEdit);
|
|
// if (ped->fBorder && rcEdit.right - rcEdit.left && rcEdit.bottom - rcEdit.top) {
|
|
//
|
|
// /*
|
|
// * Don't invalidate the border so that we avoid flicker
|
|
// */
|
|
// InflateRect(&rcEdit, -1, -1);
|
|
// }
|
|
// NtUserInvalidateRect(ped->hwnd, &rcEdit, FALSE);
|
|
ECInvalidateClient(ped, FALSE);
|
|
}
|
|
|
|
ECNotifyParent(ped, EN_CHANGE);
|
|
|
|
NotifyWinEvent(EVENT_OBJECT_VALUECHANGE, ped->hwnd, OBJID_CLIENT, INDEXID_CONTAINER);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|