/* * Xailer source code: * * MaskEdit.prg * Clase TMaskEdit() * * Copyright 2003, 2007 Ignacio Ortiz de Zúñiga * Copyright 2003, 2007 Xailer.com * All rights reserved * */ #include "Xailer.ch" //-------------------------------------------------------------------------- CLASS xMaskEdit FROM TEdit PUBLISHED: PROPERTY Value READ METHOD GetValue WRITE METHOD SetValue EDITOR PE_EDIT PROPERTY cPicture INIT "" WRITE INLINE ::SetPicture( Value, .T. ) PROPERTY lZeroFill INIT .F. PROPERTY lTrimSpaces INIT .T. RESERVED: DATA lOnFocusChange INIT .F. // IOZ: (2/6/04) Sino es Public da un scope violation PROTECTED: DATA cType INIT "C" DATA cPicFunc INIT "" DATA cPicMask INIT "" DATA cPicUser INIT "" DATA lPicComplex INIT .F. PROPERTY lPassword PROPERTY lNumeric PROPERTY lUppercase PROPERTY lLowercase PROPERTY cPasswordChar PUBLIC: METHOD Create( oParent ) CONSTRUCTOR METHOD IsBadDate() RESERVED: METHOD Undo() INLINE ::SendMsg( WM_UNDO, 0, 0 ) METHOD Clear() INLINE ::SendMsg( WM_CLEAR, 0, 0 ) METHOD Copy() INLINE ::SendMsg( WM_COPY, 0, 0 ) METHOD Cut() INLINE ::SendMsg( WM_CUT, 0, 0 ) METHOD Paste() INLINE ::SendMsg( WM_PASTE, 0, 0 ) METHOD WMUndo() METHOD WMClear() METHOD WMCut() METHOD WMPaste() METHOD WMXailer( nMsg ) METHOD GetValue() METHOD SetValue( Value, lFocused, lUpdPict, lWithEvent ) METHOD SetPicture( Value, lFromUser ) METHOD Input( cChar ) METHOD WMSetFocus( hCtl ) METHOD Valid( oNextCtl ) METHOD WMChar( nKey, nFlags, hWnd ) METHOD Change() INLINE iif(!::lOnFocusChange, ::Super:Change(), ) METHOD WMKeyDown( nKey, nFlags, hWnd ) ENDCLASS //-------------------------------------------------------------------------- METHOD Create( oParent ) CLASS XMaskEdit LOCAL nMaxLength := ::nMaxLength ::Super:Create( oParent ) ::SetValue( ::GetValue() ) IF nMaxLength != 0 .AND. nMaxLength != ::nMaxLength ::nMaxLength := nMaxLength ENDIF RETURN Self //-------------------------------------------------------------------------- METHOD WMChar( nKey, nFlags, hWnd ) CLASS xMaskEdit LOCAL uRet IF nKey == VK_BACK .AND. ::lPicComplex RETURN 0 ENDIF IF ( uRet := ::OnChar( nKey, nFlags ) ) != Nil RETURN uRet ENDIF IF !( nKey == VK_BACK .OR. nKey == VK_RETURN .OR. ; nKey == VK_TAB .OR. nKey = VK_ESCAPE .OR. ::FlReadOnly .OR. ; lXOr( lGetKeyState( VK_CONTROL ), lGetKeyState( VK_MENU ) ) .OR. ; lGetKeyState( VK_CONTROL ) ) // IOZ: Para evitar procesamientos de Ctrl+??? IF ::Input( nKey ) ::GetValue() ELSE RETURN 0 ENDIF ENDIF RETURN ::Super:WMChar( nKey, nFlags ) //-------------------------------------------------------------------------- METHOD WMSetFocus( hCtl ) CLASS xMaskEdit LOCAL uResult := ::Super:WMSetFocus( hCtl ) ::lOnFocusChange := .T. IF ::FValue == Nil ::FValue := ::cText ENDIF IF ! Empty( ::FcPicture ) IF !::IsBadDate() ::SetValue( ::GetValue() ) ENDIF IF ( ::cType == "N" .AND. !( ::lAutoSelect == asSELECTNONE ) ) .OR. "K" $ ::cPicFunc ::SelectAll() ENDIF ENDIF ::lOnFocusChange := .F. RETURN uResult //-------------------------------------------------------------------------- METHOD Valid( oNextCtl ) CLASS xMaskEdit LOCAL cValue, uResult ::lOnFocusChange := .T. IF !::IsBadDate() .AND. !Empty( ::FcPicture ) ::SetValue( ::GetValue(), .F. ) ENDIF IF ::lZeroFill .AND. ::nMaxLength > 0 .AND. ! Empty( ::Value ) .AND. ::cType == "C" cValue := AllTrim( ::Value ) IF Len( cValue ) < ::nMaxLength ::SetValue ( Replicate( "0", ::nMaxLength - Len( cValue ) ) + cValue, .F. ) ENDIF ENDIF ::lOnFocusChange := .F. uResult := ::Super:Valid( oNextCtl ) IF uResult != .F. .AND. ::IsBadDate() ::SetValue( ::GetValue(), .F. ) ENDIF RETURN uResult //-------------------------------------------------------------------------- METHOD IsBadDate() CLASS xMaskEdit LOCAL cChr IF ::cType == "D" .AND. Empty( ::GetValue() ) FOR EACH cChr IN ::GetText() IF IsDigit( cChr ) RETURN .T. ENDIF NEXT ENDIF RETURN .F. //------------------------------------------------------------------------------