Leaked source code of windows server 2003
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

/****************************************************************************\
* 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;
}