/* * $Id$ */ /* Harbour Class TGet * Copyright(C) 1999 by Ignacio Ortiz de Zúniga * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to: * * The Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. * * You can contact me at: ignacio@fivetech.com */ #include "classes.ch" #include "color.ch" #xcommand DEFAULT := ; [, := ] => ; := If( == nil, , ) ;; [ := If( == nil, , ); ] //----------------------------------------------------------------------------// CLASS TGet DATA badDate, block, buffer, cargo, changed, clear, col, colorspec DATA decpos, exitState, hasfocus, message, minus, name, original DATA picture, pos, postBlock, preBlock, reader, rejected, row DATA subscript, type, typeout DATA cPicMask, cPicFunc, nMaxLen, lEdit, lDecRev, lPicComplex METHOD New( nRow, nCol, bVarBlock, cVarName, cPicture, cColor ) METHOD Assign() INLINE ::VarPut( ::unTransform() ) METHOD KillFocus() METHOD Reset() METHOD SetFocus() METHOD Undo() METHOD unTransform() METHOD UpdateBuffer() INLINE ::Assign() METHOD VarGet() METHOD VarPut() METHOD End() METHOD Home() MESSAGE Left() METHOD _left() MESSAGE Right() METHOD _right() METHOD toDecPos() METHOD WordLeft() METHOD WordRight() METHOD backspace() MESSAGE Delete() METHOD _delete() METHOD DeleteAll() METHOD insert(cChar) METHOD overstrike(cChar) METHOD IsEditable(nPos) METHOD Input(cChar) METHOD PutMask(cBuffer, lEdit) METHOD Display() // METHOD ColorDisp(cColorSpec) VIRTUAL // METHOD hitTest(nRow, nCol) VIRTUAL // METHOD delEnd() VIRTUAL // METHOD delLeft() VIRTUAL // METHOD delRight() VIRTUAL // METHOD delWordLeft() VIRTUAL // METHOD delWordRight() VIRTUAL ENDCLASS //---------------------------------------------------------------------------// METHOD New(nRow, nCol, bVarBlock, cVarName, cPicture, cColor) CLASS TGet local cChar local nAt, nFor DEFAULT nRow := Row() ,; nCol := Col() ,; cVarName := "" ,; cPicture := "" ,; cColor := "" ::badDate := .f. ::block := bVarBlock ::changed := .f. ::clear := .f. ::col := nCol ::colorspec := cColor ::decpos := Nil ::exitState := 0 ::hasfocus := .f. ::message := "" ::minus := .f. ::name := cVarName ::original := ::VarGet() ::picture := cPicture ::pos := Nil ::postBlock := Nil ::preBlock := Nil ::reader := Nil ::rejected := .f. ::row := nRow ::subscript := Nil ::type := Valtype(::VarGet()) ::typeout := .f. // Existe function en picture if Left(cPicture, 1) == "@" nAt := At(" ", cPicture) if nAt == 0 ::cPicFunc := cPicture ::cPicMask := "" else ::cPicFunc := Substr(cPicture, 1, nAt-1) ::cPicMask := Substr(cPicture, nAt+1) endif if (nAt := At("S", ::cPicFunc)) > 0 for nFor := nAt+1 to len(::cPicFunc) if !IsDigit(Substr(::cPicFunc, nFor, 1)) exit endif next ::cPicFunc := Substr(::cPicFunc,1,nAt-1)+Substr(::cPicFunc, nFor) if ::cPicFunc == "@" ::cPicFunc := "" endif endif else ::cPicFunc := "" ::cPicMask := cPicture endif // Si es fecha y no tiene plantilla ponersela if ::type == "D" .and. Empty(::cPicMask) ::cPicMask := Set(_SET_DATEFORMAT) ::cPicMask := StrTran(::cPicmask, "y", "9") ::cPicMask := StrTran(::cPicmask, "m", "9") ::cPicMask := StrTran(::cPicmask, "d", "9") endif // Si es numero y no tiene plantilla ponersela if ::type == "N" .and. Empty(::cPicMask) ::cPicMask := "9999999999" endif // Comprobar si tiene la , y el . cambiado (Solo en Xbase++) ::lDecRev := (","$(transform(1.1,"9.9"))) // Comprobar si tiene caracteres embebidos no modificables en la plantilla ::lPicComplex := .f. if !empty(::cPicMask) For nFor := 1 to len(::cPicMask) cChar := Substr(::cPicMask, nFor, 1) if !cChar$"!ANX9#" ::lPicComplex := .t. exit endif Next endif ::buffer := ::PutMask(::VarGet(), .f. ) return Self //---------------------------------------------------------------------------// METHOD Display() CLASS TGet local cClrInverse := __ColorIndex( SetColor(), CLR_ENHANCED ) local nOldCursor := SetCursor( 0 ) @ ::Row, ::Col SAY ::buffer COLOR cClrInverse SetPos( ::Row, ::Col + If( ::Pos != nil, ::Pos - 1, 0 ) ) SetCursor( nOldCursor ) return Self //---------------------------------------------------------------------------// METHOD End() CLASS TGet if ::HasFocus ::Pos := ::nMaxLen ::Clear := .f. SetPos( ::Row, ::Col + ::Pos - 1 ) endif return nil //---------------------------------------------------------------------------// METHOD Home() CLASS TGet if ::HasFocus ::Pos := 1 ::Clear := .f. SetPos( ::Row, ::Col + ::Pos - 1 ) endif return nil //---------------------------------------------------------------------------// METHOD Reset() CLASS TGet if ::hasfocus ::buffer := ::PutMask(::VarGet()) ::pos := 1 endif return Self //---------------------------------------------------------------------------// METHOD Undo() CLASS TGet if ::hasfocus ::buffer := ::PutMask(::original) ::pos := 1 endif return Self //---------------------------------------------------------------------------// METHOD SetFocus() CLASS TGet ::hasfocus := .t. ::rejected := .f. ::typeout := .f. ::buffer := ::PutMask(::VarGet(), .f. ) ::changed := .f. ::clear := ("K"$::cPicFunc .or. ::type == "N") ::nMaxLen := Len(::buffer) ::pos := 1 ::lEdit := .f. if ::type == "N" ::decpos := At(iif(::lDecRev,",", "."), ::buffer) ::minus := ("-"$::buffer .or. "("$::buffer) else ::decpos := Nil ::minus := .f. endif if ::type == "D" ::BadDate := (At(" ", DToC(CToD(::buffer))) != 0 ) else ::BadDate := .f. endif DevPos( ::Row, ::Col + ::Pos - 1 ) return Self //---------------------------------------------------------------------------// METHOD KillFocus() CLASS TGet ::hasfocus := .f. ::pos := Nil ::Assign() ::buffer := ::PutMask() return Self //---------------------------------------------------------------------------// METHOD VarPut(xValue) CLASS TGet Eval(::block, xValue) return xValue //---------------------------------------------------------------------------// METHOD VarGet() CLASS TGet return Eval(::block) //---------------------------------------------------------------------------// METHOD Untransform(cBuffer) CLASS TGet local xValue local cChar local nFor DEFAULT cBuffer := ::buffer do case case ::type == "C" if "R"$::cPicFunc for nFor := 1 to len(::cPicMask) cChar := Substr(::cPicMask, nFor, 1) if !cChar$"ANX9#!" cBuffer := Substr(cBuffer, 1, nFor-1)+ Chr(1)+ Substr(cBuffer, nFor+1) endif next cBuffer := StrTran(cBuffer, Chr(1), "") endif xValue := cBuffer case ::type = "N" if "E"$::cPicFunc .or. ::lDecRev cBuffer := StrTran(cBuffer,".","") cBuffer := StrTran(cBuffer,",",".") else cBuffer := StrTran(cBuffer,",","") endif cBuffer := StrTran(cBuffer,"$","") cBuffer := StrTran(cBuffer,"*","") cBuffer := StrTran(cBuffer,"-","") cBuffer := StrTran(cBuffer,"(","") cBuffer := StrTran(cBuffer,")","") cBuffer := Alltrim(cBuffer) xValue := Val(cBuffer) if ::minus xValue := -(xValue) endif case ::type = "L" cBuffer := Upper(cBuffer) xValue := ("T"$cBuffer .or. "Y"$cBuffer) case ::type = "D" if "E"$::cPicFunc cBuffer := Substr(cBuffer, 4, 3)+Substr(cBuffer, 1, 3)+Substr(cBuffer, 8) endif xValue := Ctod(cBuffer) endcase return xValue //---------------------------------------------------------------------------// METHOD overstrike(cChar) CLASS TGet if ::type == "N" .and. !::lEdit ::pos := 1 endif if ::Clear .and. ::pos == 1 ::DeleteAll() ::Clear := .f. ::lEdit := .f. endif if !::lEdit ::buffer := ::PutMask(::VarGet(), .t. ) ::lEdit := .t. do while !::IsEditable(::pos) .and. ::pos <= ::nMaxLen ::pos++ enddo if ::pos > ::nMaxLen ::pos := 1 endif endif cChar := ::Input(cChar) if cChar == "" ::Rejected := .t. return Self endif ::buffer := Substr(::buffer, 1, ::Pos-1) + cChar + Substr(::buffer, ::Pos+1) ::Changed := ( ::unTransform() != ::Original ) ::Assign() ::Right() if ::type == "D" ::BadDate := (At(" ", DToC(CToD(::buffer))) != 0 ) else ::BadDate := .f. endif ::Display() return Self //---------------------------------------------------------------------------// METHOD Insert(cChar) CLASS TGet if ::type == "N" .and. !::lEdit ::pos := 1 endif if ::Clear .and. ::pos == 1 ::DeleteAll() ::Clear := .f. ::lEdit := .f. endif if !::lEdit ::buffer := ::PutMask(::VarGet(), .t. ) ::lEdit := .t. endif cChar := ::Input(cChar) if cChar == "" ::Rejected := .t. return Self endif ::buffer := Left(Substr(::buffer, 1, ::Pos-1) + cChar + Substr(::buffer, ::Pos), ::nMaxLen) ::Changed := ( ::unTransform() != ::Original ) ::Assign() ::Right() if ::type == "D" ::BadDate := (At(" ", DToC(CToD(::buffer))) != 0 ) else ::BadDate := .f. endif return Self //---------------------------------------------------------------------------// METHOD _Right() CLASS TGet local nPos if !::hasfocus return self endif ::TypeOut := .f. ::Clear := .f. if ::pos == ::nMaxLen ::TypeOut := .t. return Self endif nPos := ::Pos + 1 Do While !::IsEditable(nPos) .and. nPos <= ::nMaxLen nPos++ Enddo if nPos <= ::nMaxLen ::Pos := nPos else ::TypeOut := .t. endif DevPos( ::Row, ::Col + ::Pos - 1 ) return Self //---------------------------------------------------------------------------// METHOD _Left() CLASS TGet local nPos if !::hasfocus return self endif ::TypeOut := .f. ::Clear := .f. if ::pos == 1 ::TypeOut := .t. return Self endif nPos := ::Pos - 1 Do While !::IsEditable(nPos) .and. nPos > 0 nPos-- Enddo if nPos > 0 ::Pos := nPos else ::TypeOut := .t. endif DevPos( ::Row, ::Col + ::Pos - 1 ) return Self //---------------------------------------------------------------------------// METHOD WordLeft() CLASS TGet local nPos if !::hasfocus return self endif ::TypeOut := .f. ::Clear := .f. if ::pos == 1 ::TypeOut := .t. return Self endif nPos := ::Pos - 1 Do While Substr(::buffer, nPos, 1) != " " .and. nPos > 0 nPos-- Enddo if nPos > 0 ::Pos := nPos endif return Self //---------------------------------------------------------------------------// METHOD WordRight() CLASS TGet local nPos if !::hasfocus return self endif ::TypeOut := .f. ::Clear := .f. if ::pos == ::nMaxLen ::TypeOut := .t. return Self endif nPos := ::Pos + 1 Do While Substr(::buffer, nPos, 1) != " " .and. nPos <= ::nMaxLen nPos++ Enddo if nPos <= ::nMaxLen ::Pos := nPos endif return Self //---------------------------------------------------------------------------// METHOD ToDecPos() CLASS TGet if !::hasFocus .or. ::decpos == Nil Return .f. endif ::Clear := .f. ::buffer := ::PutMask(::UnTransform(), .t. ) ::pos := ::decpos+1 return .t. //---------------------------------------------------------------------------// METHOD IsEditable(nPos) CLASS TGet local cChar if empty(::cPicMask) return .t. endif if nPos > ::nMaxLen return .f. endif cChar := Substr(::cPicMask, nPos, 1) do case case ::type == "C" return (cChar$"!ANX9#") case ::type == "N" return (cChar$"9#$*") case ::type == "D" return (cChar == "9") case ::type == "L" return (cChar$"TFYN") endcase return .f. //---------------------------------------------------------------------------// METHOD Input(cChar) CLASS TGet do case case ::type == "N" do case case cChar == "-" if ::pos != 1 return "" endif ::minus := .t. case cChar == "." ::toDecPos() return "" case !(cChar$"0123456789") return "" endcase case ::type == "D" if !(cChar$"0123456789") return "" endif case ::type == "L" if !(Upper(cChar)$"YNTF") return "" endif endcase if !Empty(::cPicFunc) cChar := Transform(cChar, ::cPicFunc) endif if !Empty(::cPicMask) cChar := Transform(cChar, Substr(::cPicMask, ::pos, 1)) endif return cChar //---------------------------------------------------------------------------// METHOD PutMask(xValue, lEdit) CLASS TGet local cChar, cBuffer local nFor, nLen, nAt DEFAULT xValue := ::VarGet() ,; lEdit := ::hasfocus cBuffer := Transform(xValue, Alltrim(::cPicFunc+" "+::cPicMask)) if lEdit .and. ::type == "N" .and. !Empty(::cPicMask) nLen := len(cBuffer) for nFor := 1 to nLen cChar := Substr(::cPicMask, nFor, 1) if cChar$",." .and. Substr(cBuffer, nFor, 1) != cChar cBuffer := Substr(cBuffer, 1, nFor-1) + cChar + Substr(cBuffer, nFor+1) endif next if (nAt := At(" ", cBuffer)) > 0 cBuffer := Strtran(cBuffer, "0", " ", nAt) endif if ::lDecRev cBuffer := Strtran(cBuffer, ",", Chr(1)) cBuffer := Strtran(cBuffer, ".", ",") cBuffer := Strtran(cBuffer, Chr(1), ".") endif endif return cBuffer //---------------------------------------------------------------------------// METHOD BackSpace() CLASS TGet local nPos := ::Pos ::Left() if ::Pos < nPos ::Delete() endif return Self //---------------------------------------------------------------------------// METHOD _Delete() CLASS TGet do case case ::type == "C" if !::lPicComplex ::buffer := Padr(Substr(::buffer, 1, ::Pos-1) + ; Substr(::buffer, ::Pos+1), ::nMaxLen) else ::buffer := Substr(::buffer, 1, ::Pos-1) +" "+ ; Substr(::buffer, ::Pos+1) endif case ::type == "N" if Substr(::buffer, ::Pos, 1) == "-" ::minus := .f. endif ::buffer := Substr(::buffer, 1, ::Pos-1) +" "+ ; Substr(::buffer, ::Pos+1) case ::type == "D" ::buffer := Substr(::buffer, 1, ::Pos-1) +" "+ ; Substr(::buffer, ::Pos+1) case ::type == "L" ::buffer := " " endcase ::Assign() ::Display() return Self //---------------------------------------------------------------------------// METHOD DeleteAll() CLASS TGet local xValue do case case ::type == "C" xValue := Space(::nMaxlen) case ::type == "N" xValue := 0 case ::type == "D" xValue := Dtoc("") case ::type == "L" xValue := .f. endcase ::buffer := ::PutMask(xValue,.t.) ::Pos := 1 ::Assign() return Self //---------------------------------------------------------------------------// Function GetNew( nRow, nCol, bVarBlock, cVarName, cPicture, cColor ) return TGet():New( nRow, nCol, bVarBlock, cVarName, cPicture, cColor ) //---------------------------------------------------------------------------// function _GET_( uVar, cVarName, cPicture, bValid, bWhen, bSetGet ) return TGet():New(,, bSetGet, cVarName, cPicture ) //---------------------------------------------------------------------------//