// Copyright (c) 1993-2005 "Компания БЭСТ". Все права сохраняются.

#xcommand DEFAULT <v1> TO <x1> [, <vn> TO <xn> ] => ;
                                IF <v1> == NIL ; <v1> := <x1> ; END ;
                                [; IF <vn> == NIL ; <vn> := <xn> ; END ]

#include "inkey.ch"
#include "hdll.ch"
#include "set.ch"

#ifdef __HARBOUR__

#include "gtinfo.ch"

#endif




/**************


#define BLACK          0x0 ,0x0 ,0x0  //N
#define BLUE           0x0 ,0x0 ,0x85  //B
#define GREEN          0x0 ,0x85,0x0   //G
#define CYAN           0x0 ,0x85,0x85  //BG
#define RED            0x85,0x0 ,0x0   //R
#define MAGENTA        0x85,0x0 ,0x85  //RB
#define BROWN          0x85,0x85,0x0   //GR
#define WHITE          0xC6,0xC6,0xC6   //W
#define GRAY           0x60,0x60,0x60    //N+
#define BRIGHT_BLUE       0x00,0x00,0xFF //B+
#define BRIGHT_GREEN      0x60,0xFF,0x60  //G+
#define BRIGHT_CYAN       0x60,0xFF,0xFF  //BG+
#define BRIGHT_RED        0xF8,0x00,0x26  //R+
#define BRIGHT_MAGENTA    0xFF,0x60,0xFF  //RB+
#define YELLOW         0xFF,0xFF,0x00     //GR+
#define BRIGHT_WHITE      0xFF,0xFF,0xFF  //W+

********************************/


STATIC hFR_Dll //Handler of FastReport.dll

STATIC nWRow:=0,nWCol:=0

Function GetNewBest(nRow,nCol,bVarBlock,cVarName,cPicture,cColor )// --> oGet
  LOCAL oGet
  oGet := Get():New()
  IF !EMPTY(cPicture).AND.cPicture="D"
     cPicture:="@D"
  ENDIF
  oGet:picture:=cPicture
  oGet:ROW:=nRow + WRow() + nWRow
  oGet:COL:=nCol + WCol() + nWCol
  oGet:BLOCK:=bVarBlock
  oGet:NAME:=cVarName
  oGet:colorSpec:=cColor
RETURN( oGet)


PROCEDURE WSelectForGet(nTop,nLeft)
IF nTop!=NIL
   nWRow:=nTop
   nWCol:=nLeft
ELSE
   nWRow:=0
   nWCol:=0
ENDIF
RETURN

FUNCTION SayScreen_(cString,nRow,nCol,cColor)
nRow+=WRow()
nCol+=WCol()
RETURN  SayScreen(cString,nRow,nCol,cColor)

FUNCTION colorWin_(nTop,nLeft,nBottom,nRight,cNew,cOld)
WCoord(@nTop,@nLeft,@nBottom,@nRight)
RETURN colorwin(nTop,nLeft,nBottom,nRight,cNew,cOld)


FUNCTION cLearWin_(nTop,nLeft,nBottom,nRight,cColor,cClear)
WCoord(@nTop,@nLeft,@nBottom,@nRight)
RETURN clearwin(nTop,nLeft,nBottom,nRight,cColor,cClear)

Function _mRow(lAbs)
IF lAbs!=NIL
   RETURN mRow()
ENDIF
Return mRow()-WRow()
//
Function _mCol(lAbs)
IF lAbs!=NIL
   RETURN mCol()
ENDIF
Return mCol()-WCol()

Function NUMDISKF()
LOCAL a := AllDrives()
LOCAL n:=0
IF "A" in a
   n++
ENDIF
IF "B" in a
   n++
ENDIF
RETURN n

Function Sound()
Return NIL

Function InKeyTrap(n,n1)
While (nKey:=Inkey(,n1))==0
#ifndef __PLATFORM__Linux
  sleep(5)
#endif
EndDo
If VALTYPE(bKey:=SetKey(nKey)) = "B"
   Eval(bKey, ProcName(1), ProcLine(1), "")
EndIf
RETURN nKey
//
Function TrapAnyKey()
Return NIL
//
Function _KeyList()
Return NIL
//
Function _ClearKey()
Return NIL
//
//
//
Function IsMSWin()
Return .T.
//
Function IsMSNT() // Detect NT/2000/XP
Return GetE("OS") == "Windows_NT"
//

PROCEDURE SetShare()
RETURN

Function FilesMax()
Return 1000
//
Function FilesFree()
Return 1000
//
//
Function  savefseek()
Return NIL
//
Function  restfseek()
Return NIL
//
//proc CURRENTGET
proc SETKXLAT
proc KBDEMULATE

proc BRRESTSCREEEN

FUNCTION OnRej(nOrigin,cEnter)
    LOCAL aRet:={}
            AEVAL(m->Global_Set[29],{|x| AADD(aRet,.T.) })
RETURN ( aRet)

FUNCTION BLOBIMPORT()
RETURN ""
//


PROCEDURE GenerateKeyFromScreen(nRow,nCol)
STATIC aKeys := {;
    {"HOME",           K_HOME, "CTRL"},;
    {"END",            K_END, "CTRL"},;
    {"PGUP",           K_PGUP,"CTRL" },;
    {"PGDN",           K_PGDN,"CTRL" },;
    {"CTRL-HOME",      K_CTRL_HOME,"CTRL" },;
    {"CTRL-END",       K_CTRL_END,"CTRL" },;
    {"CTRL-PGUP",      K_CTRL_PGUP,"CTRL" },;
    {"CTRL-PGDN",      K_CTRL_PGDN,"CTRL" },;
    {"ALT-HOME",       K_ALT_HOME ,"ALT"},;
    {"ALT-END",        K_ALT_END ,"ALT"},;
    {"ALT-PGUP",       K_ALT_PGUP ,"ALT"},;
    {"ALT-PGDN",       K_ALT_PGDN ,"ALT"},;
    {"ENTER",          K_ENTER, },;
    {"┘",          K_ENTER, },;
    {"ПРОБЕЛ",         K_SPACE, },;
    {"ESC",            K_ESC, },;
    {"CTRL┘",     K_CTRL_ENTER,"CTRL" },;
    {"ALT┘",      K_ALT_ENTER ,"ALT"},;
    {"INS",            K_INS, "CTRL"},;
    {"K-DEL",            K_DEL,"CTRL" },;
    {"TAB",            K_TAB,"CTRL" },;
    {"SH-TAB",         K_SH_TAB,"SH" },;
    {"CTRL-INS",       K_CTRL_INS,"CTRL" },;
    {"CTRL-DEL",      K_CTRL_DEL,"CTRL" },;
    {"CTRL-TAB", K_CTRL_TAB,"CTRL"},;
    {"ALT-INS", K_ALT_INS,"ALT"},;
    {"ALT-DEL", K_ALT_DEL,"ALT"},;
    {"CTRL-A" , K_CTRL_A ,"CTRL"},;
    {"CTRL-B" , K_CTRL_B ,"CTRL"},;
    {"CTRL-C" , K_CTRL_C ,"CTRL"},;
    {"CTRL-D" , K_CTRL_D ,"CTRL"},;
    {"CTRL-E" , K_CTRL_E ,"CTRL"},;
    {"CTRL-F" , K_CTRL_F ,"CTRL"},;
    {"CTRL-G" , K_CTRL_G ,"CTRL"},;
    {"CTRL-H" , K_CTRL_H ,"CTRL"},;
    {"CTRL-I" , K_CTRL_I ,"CTRL"},;
    {"CTRL-J" , K_CTRL_J ,"CTRL"},;
    {"CTRL-K" , K_CTRL_K ,"CTRL"},;
    {"CTRL-L" , K_CTRL_L ,"CTRL"},;
    {"CTRL-M" , K_CTRL_M ,"CTRL"},;
    {"CTRL-N" , K_CTRL_N ,"CTRL"},;
    {"CTRL-O" , K_CTRL_O ,"CTRL"},;
    {"CTRL-P" , K_CTRL_P ,"CTRL"},;
    {"CTRL-Q" , K_CTRL_Q ,"CTRL"},;
    {"CTRL-R" , K_CTRL_R ,"CTRL"},;
    {"CTRL-S" , K_CTRL_S ,"CTRL"},;
    {"CTRL-T" , K_CTRL_T ,"CTRL"},;
    {"CTRL-U" , K_CTRL_U ,"CTRL"},;
    {"CTRL-V" , K_CTRL_V ,"CTRL"},;
    {"CTRL-W" , K_CTRL_W ,"CTRL"},;
    {"CTRL-X" , K_CTRL_X ,"CTRL"},;
    {"CTRL-Y" , K_CTRL_Y ,"CTRL"},;
    {"CTRL-Z" , K_CTRL_Z ,"CTRL"},;
    {"ALT-A" , K_ALT_A ,"ALT"},;
    {"ALT-B" , K_ALT_B ,"ALT"},;
    {"ALT-C" , K_ALT_C ,"ALT"},;
    {"ALT-D" , K_ALT_D ,"ALT"},;
    {"ALT-E" , K_ALT_E ,"ALT"},;
    {"ALT-F" , K_ALT_F ,"ALT"},;
    {"ALT-G" , K_ALT_G ,"ALT"},;
    {"ALT-H" , K_ALT_H ,"ALT"},;
    {"ALT-I" , K_ALT_I ,"ALT"},;
    {"ALT-J" , K_ALT_J ,"ALT"},;
    {"ALT-K" , K_ALT_K ,"ALT"},;
    {"ALT-L" , K_ALT_L ,"ALT"},;
    {"ALT-M" , K_ALT_M ,"ALT"},;
    {"ALT-N" , K_ALT_N ,"ALT"},;
    {"ALT-O" , K_ALT_O ,"ALT"},;
    {"ALT-P" , K_ALT_P ,"ALT"},;
    {"ALT-Q" , K_ALT_Q ,"ALT"},;
    {"ALT-R" , K_ALT_R ,"ALT"},;
    {"ALT-S" , K_ALT_S ,"ALT"},;
    {"ALT-T" , K_ALT_T ,"ALT"},;
    {"ALT-U" , K_ALT_U ,"ALT"},;
    {"ALT-V" , K_ALT_V ,"ALT"},;
    {"ALT-W" , K_ALT_W ,"ALT"},;
    {"ALT-X" , K_ALT_X ,"ALT"},;
    {"ALT-Y" , K_ALT_Y ,"ALT"},;
    {"ALT-Z" , K_ALT_Z ,"ALT"},;
    {"ALT-1" , K_ALT_1 ,"ALT"},;
    {"ALT-2" , K_ALT_2 ,"ALT"},;
    {"ALT-3" , K_ALT_3 ,"ALT"},;
    {"ALT-4" , K_ALT_4 ,"ALT"},;
    {"ALT-5" , K_ALT_5 ,"ALT"},;
    {"ALT-6" , K_ALT_6 ,"ALT"},;
    {"ALT-7" , K_ALT_7 ,"ALT"},;
    {"ALT-8" , K_ALT_8 ,"ALT"},;
    {"ALT-9" , K_ALT_9 ,"ALT"},;
    {"ALT-0" , K_ALT_0 ,"ALT"},;
    {"F1" , K_F1 ,},;
    {"F2" , K_F2 ,},;
    {"F3" , K_F3 ,},;
    {"F4" , K_F4 ,},;
    {"F5" , K_F5 ,},;
    {"F6" , K_F6 ,},;
    {"F7" , K_F7 ,},;
    {"F8" , K_F8 ,},;
    {"F9" , K_F9 ,},;
    {"F10" , K_F10 ,},;
    {"F11" , K_F11 ,},;
    {"F12" , K_F12 ,},;
    {"CTRL-F1" , K_CTRL_F1 ,"CTRL"},;
    {"CTRL-F2" , K_CTRL_F2 ,"CTRL"},;
    {"CTRL-F3" , K_CTRL_F3 ,"CTRL"},;
    {"CTRL-F4" , K_CTRL_F4 ,"CTRL"},;
    {"CTRL-F5" , K_CTRL_F5 ,"CTRL"},;
    {"CTRL-F6" , K_CTRL_F6 ,"CTRL"},;
    {"CTRL-F7" , K_CTRL_F7 ,"CTRL"},;
    {"CTRL-F8" , K_CTRL_F8 ,"CTRL"},;
    {"CTRL-F9" , K_CTRL_F9 ,"CTRL"},;
    {"CTRL-F10" , K_CTRL_F10 ,"CTRL"},;
    {"CTRL-F11" , K_CTRL_F11 ,"CTRL"},;
    {"CTRL-F12" , K_CTRL_F12 ,"CTRL"},;
    {"ALT-F1" , K_ALT_F1 ,"ALT"},;
    {"ALT-F2" , K_ALT_F2 ,"ALT"},;
    {"ALT-F3" , K_ALT_F3 ,"ALT"},;
    {"ALT-F4" , K_ALT_F4 ,"ALT"},;
    {"ALT-F5" , K_ALT_F5 ,"ALT"},;
    {"ALT-F6" , K_ALT_F6 ,"ALT"},;
    {"ALT-F7" , K_ALT_F7 ,"ALT"},;
    {"ALT-F8" , K_ALT_F8 ,"ALT"},;
    {"ALT-F9" , K_ALT_F9 ,"ALT"},;
    {"ALT-F10" , K_ALT_F10 ,"ALT"},;
    {"ALT-F11" , K_ALT_F11 ,"ALT"},;
    {"ALT-F12" , K_ALT_F12 ,"ALT"},;
    {"SH-F1" , K_SH_F1 ,"SH"},;
    {"SH-F2" , K_SH_F2 ,"SH"},;
    {"SH-F3" , K_SH_F3 ,"SH"},;
    {"SH-F4" , K_SH_F4 ,"SH"},;
    {"SH-F5" , K_SH_F5 ,"SH"},;
    {"SH-F6" , K_SH_F6 ,"SH"},;
    {"SH-F7" , K_SH_F7 ,"SH"},;
    {"SH-F8" , K_SH_F8 ,"SH"},;
    {"SH-F9" , K_SH_F9 ,"SH"},;
    {"SH-F10" , K_SH_F10 ,"SH"},;
    {"SH-F11" , K_SH_F11 ,"SH"},;
    {"SH-F12" , K_SH_F12 ,"SH"} }

LOCAL cStr:=ScreenStr(nRow,0,MAXCOL())
LOCAL i:=nCol+1,nPos

LOCAL cMouse := Upper(GETENV('BEST_MOUSE'))
IF !EMPTY(cMouse).AND.cMouse[1]="F"
   RETURN
ENDIF


WHILE !cStr[i]$": ".AND.i>0
   i--
ENDDO

IF cStr[i]=":"
   WHILE !cStr[i]$" ".AND.i>0
   i--
   ENDDO
ENDIF
cStr:=SUBSTR(cStr,i+1)

IF (nPos:=AT(":",cStr))>1
   i:=nCol-i+1
   cStr:=TRIM(UPPER(TRIM(LEFT(cStr,nPos-1))))
   cStr:=STRTRAN(cStr,"SHIFT","SH")
   DO CASE
      CASE cStr=="PGDN/PGUP"
      IF i>5
         cStr:="PGUP"
      ELSE
         cStr:="PGDN"
      ENDIF

      CASE cStr=="F6,ALT-F6"
      IF i>4
         cStr:="F6"
      ELSE
         cStr:="ALT-F6"
      ENDIF

      CASE cStr=="F6,ALT-F12"
      IF i>4
         cStr:="F6"
      ELSE
         cStr:="ALT-F12"
      ENDIF

      CASE cStr=="F7,ALT-F7"
      IF i>4
         cStr:="F7"
      ELSE
         cStr:="ALT-F7"
      ENDIF
   ENDCASE

//@ 0,0 SAY cStr

   IF (i:=ASCAN(aKeys,{|x|x[1]==cStr}))>0
      HB_KeyPut(aKeys[i,2])
   ENDIF
ENDIF
RETURN

FUNCTION DllCall(cDLL,cFunction,cPar1,cPar2,cPar3,cPar4,cPar5,cPar6)
#ifdef __PLATFORM__Linux
#else
Local hDll := IF(VALTYPE(cDll)=="C",Loadlibrary(cDll),cDll)
Local pAddr := GetProcAddress(hDll,cFunction)
LOCAL nCount:=0,nRet:=0
IF cPar6 !=NIL
   nCount:=6
ELSEIF cPar5!=NIL
   nCount:=5
ELSEIF cPar4!=NIL
   nCount:=4
ELSEIF cPar3!=NIL
   nCount:=3
ELSEIF cPar2!=NIL
   nCount:=2
ELSEIF cPar1!=NIL
   nCount:=1
ELSE
   nCount:=0
ENDIF

DO CASE
   CASE nCount==0
   nRet:=CallDLL(hDll,pAddr,DC_CALL_STD_MS)
   CASE nCount==1
   nRet:=CallDLL(hDll,pAddr,DC_CALL_STD_MS,,GetType(cPar1),cPar1)
   CASE nCount==2
   nRet:=CallDLL(hDll,pAddr,DC_CALL_STD_MS,,GetType(cPar1),cPar1,GetType(cPar2),cPar2)
   CASE nCount==3
   nRet:=CallDLL(hDll,pAddr,DC_CALL_STD_MS,,GetType(cPar1),cPar1,GetType(cPar2),cPar2,GetType(cPar3),cPar3)
   CASE nCount==4
   nRet:=CallDLL(hDll,pAddr,DC_CALL_STD_MS,,GetType(cPar1),cPar1,GetType(cPar2),cPar2,GetType(cPar3),cPar3,GetType(cPar4),cPar4)
   CASE nCount==5
   nRet:=CallDLL(hDll,pAddr,DC_CALL_STD_MS,,GetType(cPar1),cPar1,GetType(cPar2),cPar2,GetType(cPar3),cPar3,GetType(cPar4),cPar4,GetType(cPar5),cPar5)
   CASE nCount==6
   nRet:=CallDLL(hDll,pAddr,DC_CALL_STD_MS,,GetType(cPar1),cPar1,GetType(cPar2),cPar2,GetType(cPar3),cPar3,GetType(cPar4),cPar4,GetType(cPar5),cPar5,GetType(cPar6),cPar6)
ENDCASE
IF VALTYPE(cDll)="C"
   FreeLibrary(hDll)
ENDIF
#endif
RETURN nRet

STATIC FUNCTION GetType(xVal)
LOCAL cType:=VALTYPE(xVal),nRet:=0
DO CASE
   CASE cType=="C"
   nRet:=10
   CASE cType=="N"
   nRet:=3
ENDCASE
RETURN nRet


PROCEDURE FRLoad()
#ifdef __PLATFORM__Linux
#else

LOCAL cDllName:=ExePath()+"Report4"
hFR_Dll:= LoadLibrary(cDllName)
#endif
RETURN

PROCEDURE FRUnLoad()
#ifdef __PLATFORM__Linux
#else
IF !EMPTY(hFR_Dll)
   FreeLibrary(hFR_Dll)
ENDIF
#endif
RETURN

FUNCTION FRCall(cFunction,cPar1,cPar2,cPar3,cPar4,cPar5,cPar6)
LOCAL xRet
LOCAL cMouse := Upper(GETENV('BEST_MOUSE'))
IF EMPTY(hFR_Dll)
   FRLoad()
ENDIF
MSetCursor(.T.)
xRet:=DllCall(hFR_DLL,cFunction,cPar1,cPar2,cPar3,cPar4,cPar5,cPar6)
IF !EMPTY(cMouse).AND.cMouse[1]="F"
   MSetCursor(.F.)
ENDIF
RETURN xRet


FUNCTION ExePath()
LOCAL cExe:=EXENAME()
LOCAL i:=RAT("\",cExe)
RETURN LEFT(cExe,i)

FUNCTION MemoEdit_(cText,nTop,nLeft,nBottom,nRight,lSost,cFunc,nWidth,nTab,nRow,nCol,nRelRow,nRelCol)
LOCAL nRet,cBuffer:="",cScreen:="",lReNew:=.F.
LOCAL bK_ALT_A:=SETKEY(K_ALT_A,NIL)
LOCAL nKey:=INKEY()
LOCAL nLenKeyBuffer:=SET(_SET_TYPEAHEAD,100)
LOCAL bK_CTRL_INS:=SETKEY(K_CTRL_INS,{||IF(lReNew,(ClearBuffer(nBottom,nLeft,@cBuffer,@cScreen),lRenew:=.F.),),SelectLine(nBottom,nLeft,@cBuffer,@cScreen)})
LOCAL bK_SH_INS:=SETKEY(K_SH_INS,{||fromBuffer(),lReNew:=.T.})
LOCAL bK_SH_RIGHT:=SETKEY(K_SH_RIGHT,{||IF(lReNew,(ClearBuffer(nBottom,nLeft,@cBuffer,@cScreen),lRenew:=.F.),),SelectPlus(ScreenStr(ROW(),COL(),1),nBottom,nLeft,@cBuffer,@cScreen)})
LOCAL bK_SH_LEFT:=SETKEY(K_SH_LEFT, {||IF(lReNew,(ClearBuffer(nBottom,nLeft,@cBuffer,@cScreen),lRenew:=.F.),),SelectMinus(ScreenStr(ROW(),COL(),1),nBottom,nLeft,@cBuffer,@cScreen)})
IF !EMPTY(nkey)
   KEYBOARD CHR(nkey)
ENDIF

nRet:=ctw_MemoEdit(cText,nTop,nLeft,nBottom,nRight,lSost,cFunc,nWidth,nTab,nRow,nCol,nRelRow,nRelCol)


SET(_SET_TYPEAHEAD,nLenKeyBuffer)
SETKEY(K_CTRL_INS,bK_CTRL_INS)
SETKEY(K_SH_INS,bK_SH_INS)
SETKEY(K_SH_RIGHT,bK_SH_RIGHT)
SETKEY(K_SH_LEFT,bK_SH_LEFT)
SETKEY(K_ALT_A,bK_ALT_A)
RETURN nRet

STATIC PROCEDURE SelectPlus(c,nTop,nLeft,cBuffer,cScreen)
IF LEN(cBuffer)<100
   cBuffer+=c
   cScreen+=ScreenStr(nTop+1,nLeft+LEN(cScreen),1)
   SayScreen(cBuffer,nTop+1,nLeft)
   KEYBOARD CHR(K_RIGHT)
   ToBuffer(cBuffer)
ELSE
   SayError("Превышен лимит копирования!")
ENDIF
SETCURSOR(1)
RETURN


STATIC PROCEDURE SelectMinus(c,nTop,nLeft,cBuffer,cScreen)
cBuffer:=LEFT(cBuffer,LEN(cBuffer)-1)
SayScreen(RIGHT(cScreen,1),nTop+1,nLeft+LEN(cScreen)-1)
cScreen:=LEFT(cScreen,LEN(cScreen)-1)
KEYBOARD CHR(K_LEFT)
ToBuffer(cBuffer)
SETCURSOR(1)
RETURN


STATIC PROCEDURE SelectLine(nTop,nLeft,cBuffer,cScreen)
LOCAL nCol:=COL(),c
WHILE !EMPTY((c:=ScreenStr(,nCol,1))+ScreenStr(,nCol+1,1)).AND.;
   c!=CHR(13).AND.c!=CHR(10).AND.LEN(cBuffer)<99
   cBuffer+=c
   cScreen+=ScreenStr(nTop+1,nLeft+LEN(cScreen),1)
   nCol++
ENDDO
//cBuffer+=" "

SayScreen(cBuffer,nTop+1,nLeft)
ToBuffer(cBuffer)
SETCURSOR(1)
RETURN

STATIC PROCEDURE ToBuffer(cBuf)
#ifdef __PLATFORM__Linux
#else
WVT_SetClipboard(AllTrim(cBuf))
#endif
RETURN

STATIC PROCEDURE FromBuffer()
#ifdef __PLATFORM__Linux
#else
LOCAL cBuffer := WVT_GetClipboard()
IF VALTYPE(cBuffer)="C"
   cBuffer:=STRTRAN(TRIM(LEFT(cBuffer,99)),CHR(13)+CHR(10)," ")
   IF LEN(cBuffer)>0
      KEYBOARD cBuffer
   ENDIF
ENDIF
#endif
RETURN

STATIC PROCEDURE ClearBuffer(nTop,nLeft,cBuffer,cScreen)
SayScreen(cScreen,nTop+1,nLeft)
cBuffer:=""
cScreen:=""
ToBuffer(cBuffer)
RETURN

Function NulFunction()
RETURN(NIL)

PROCEDURE WCoord(nTop,nLeft,nBottom,nRight)
IF nTop = NIL
   nTop=WRow()
ELSE
   nTop+=WRow()
ENDIF
IF nLeft = NIL
   nLeft=WCol()
ELSE
   nLeft+=WCol()
ENDIF
IF nBottom = NIL
   nBottom=WLastRow()
ELSE
   nBottom+=WRow()
ENDIF
IF nRight = NIL
   nRight=WLastCol()
ELSE
   nRight+=WCol()
ENDIF
RETURN

FUNCTION ExeName_()
RETURN UPPER(ExeName())

#DEFINE COL_BROWSE  'w+/b,n/w,,,w+/b'


Function SetFont()
#ifdef __PLATFORM__Linux
#else
Local aSet := SaveSet()
LOCAL aYes:={'Да ','Нет'}
Local nT := 8,nL := 10 ,nB := 16,nR := 68
Local GetList := {}, oGet
Local aPalette:= {{0,'Стандартная'},;
                  {1,'Веселенькая'} ;
               }

LOCAL aFontInfo := WVT_GetFontInfo()
LOCAL sPlus
LOCAL sMinus

IF !HB_GT_VERSION()$"GTWVT"
   RETURN NIL
ENDIF

sPlus:=SETKEY(ASC("+"),{||SetPlus(getlist[2],1)})
sMinus:=SETKEY(ASC("-"),{||SetPlus(getlist[2],-1)})

PRIVATE lYes,cFont,wFont,hFont,pPalette,cTypeFont

lYes:=.F.
pPalette:=PaletteInfo()
cFont := aFontInfo[1]
hFont := aFontInfo[2]
wFont := aFontInfo[3]
cTypeFont:=SPACE(1)+STR(wFont,2,0)+" x "+STR(hFont,2,0)+SPACE(1)

IF NetUse("Font",cProPath+"Font", , ,'DBFCDX')

   Font->(MakeRefer("Font","Шрифт",1,{"Размер"},;
   {3,50,11},,{"SPACE(1)+STR(Width,2,0)+' x '+STR(Height,2,0)+SPACE(1)"},{"cTypeFont"},;
   "SUBSTR(cTypeFont,2,2)+SUBSTR(cTypeFont,7,2)",;
    {{||" "+STR(Width,2,0)+" x "+STR(Height,2,0)+" "}}))

   Frame("[ Настройка экрана ]", nT,nL,nB,nR,COL_BROWSE,2,1,1)

   @ nT+2,nL+2 SAY "Стандартная настройка : " Color COL_BROWSE
//   @ nT+3,nL+2 SAY "Палитра...............: " Color COL_BROWSE
   @ nT+4,nL+2 SAY "Шрифт.................: " Color COL_BROWSE
   @ nT+5,nL+2 SAY "- увеличить...........: < + >" Color COL_BROWSE
   @ nT+6,nL+2 SAY "- уменьшить...........: < - >" Color COL_BROWSE

   oGet := GETNEW(nT+2,nL+26,{|x| IF(x==NIL, lYes, lYes:=(x==aYes[1])),;
                            IF(lYes,aYes[1],aYes[2])} ,"lYes")
   oGet:reader := {|x| CondReader(x)}
   oGet:postblock:={|x|if(lYes,(;
   DefaultFontPalette(),AEVAL(GetList,{|x|x:display()})),),.T.}
   oGet:ColorSpec := COL_BROWSE
   AADD(GetList, oGet)


  /********
   oGet:=GETNEW(nT+3,nL+26,{|x|RotateBlock(x,aPalette,'pPalette')})
   oGet:reader    := {|x|RotateAndReader(x,aPalette) }
   oGet:ColorSpec := COL_BROWSE
   AADD(GetList, oGet)
********/

   oGet:=GETNEW(nT+4,nL+26,MemVarBlock("cTypeFont"),"cTypeFont")
   oGet:reader    := {|x|ReferGetReader(x,"Font") }
   oGet:ColorSpec := COL_BROWSE
   AADD(GetList, oGet)


   AEVAL( GetList, {|x| x:Display() } )

   SetCursor(1)
   READ
   IF LASTKEY()!=K_ESC
      Font->(DBSEEK(SUBSTR(cTypeFont,2,2)+SUBSTR(cTypeFont,7,2)))
      cFont:=TRIM(Font->Name)
      wFont:=Font->Width
      hFont:=Font->Height
      SaveStation({;
      {"Palette",pPalette},;
      {"FontName",cFont},;
      {"FontWidth",wFont},;
      {"FontHeight",hFont};
      })
      InitFontPalette(pPalette,cFont,wFont,hFont)
   ENDIF
   Font->(dbCloseArea())
ENDIF
SETKEY(ASC("+"),sPlus)
SETKEY(ASC("-"),sMinus)
RestSet(aSet)
#endif
Return NIL

STATIC PROCEDURE SetPlus(get,n)
#ifdef __PLATFORM__Linux
#else
LOCAL aFontInfo
Font->(DBSEEK(SUBSTR(cTypeFont,2,2)+SUBSTR(cTypeFont,7,2)))
IF n!=NIL
   SKIP n
ENDIF
IF !EOF()
  WVT_SetFont(TRIM(Font->Name),Font->Height,Font->Width)
   aFontInfo:= WVT_GetFontInfo()
   cTypeFont:=SPACE(1)+STR(aFontInfo[3],2,0)+' x '+STR(aFontInfo[2],2,0)+SPACE(1)
   IF get!=NIL
      get:display()
   ENDIF
ENDIF
#endif
RETURN


PROCEDURE InitFontPalette(nPalette,cFontName,nFontWidth,nFontHeight)
#ifdef __PLATFORM__Linux
#else
Local aFontInfo
IF !HB_GT_VERSION()$"GTWVT"
   RETURN NIL
ENDIF

aFontInfo := WVT_GetFontInfo()
cFontName:=TRIM(cFontName)

IF EMPTY(cFontName)
   DefaultFontPalette()
ELSE
   SelectPalette(nPalette)
   IF !(UPPER(aFontInfo[1])==UPPER(cFontName).AND.aFontInfo[2]==nFontHeight.AND.aFontInfo[3]==nFontWidth)
      WVT_SetFont(cFontName,nFontHeight,nFontWidth)
   ENDIF
ENDIF
#endif
RETURN

STATIC PROCEDURE DefaultFontPalette()
LOCAL nWidth:=GTInfo(GTI_DESKTOPWIDTH)
LOCAL nHeight:=GTInfo(GTI_DESKTOPHEIGHT)
LOCAL lOpen:=SELECT("FONT")>0
LOCAL nArea:=SELECT()
LOCAL nFontHeight,nFontWidth
IF !lOpen
   NetUse("Font",cProPath+"Font", , ,'DBFCDX')
ENDIF
DO CASE
      CASE nWidth<800
      nFontHeight:=12;nFontWidth:=8
      CASE nWidth=800
      nFontHeight:=21;nFontWidth:=10
      CASE nWidth=1024
      nFontHeight:=28;nFontWidth:=12
      CASE nWidth=1152
      nFontHeight:=28;nFontWidth:=14
      CASE nWidth=1280
      nFontHeight:=26;nFontWidth:=16
      CASE nWidth=1360
      nFontHeight:=28;nFontWidth:=17
      CASE nWidth=1600 .AND. nHeight=900
      nFontHeight:=28;nFontWidth:=20
      CASE nWidth=1600 .AND. nHeight=1024
      nFontHeight:=30;nFontWidth:=20
      CASE nWidth=1920
      nFontHeight:=36;nFontWidth:=22
      CASE nWidth=2048
      nFontHeight:=36;nFontWidth:=22
   OTHERWISE
      nFontHeight:=21;nFontWidth:=11
ENDCASE
Font->(DBSEEK(STR(nFontWidth,2,0)+STR(nFontHeight,2,0)))
m->cTypeFont:=SPACE(1)+STR(Font->Width,2,0)+' x '+STR(Font->Height,2,0)+SPACE(1)
nPalette:=0
SelectPalette(nPalette)
SetPlus()
IF !lOpen
   Font->(DbCloseArea())
ENDIF
SELECT(nArea)
RETURN


STATIC PROCEDURE SelectPalette(nPalette)
/******************
DO CASE
   CASE nPalette==0 //рабочая
      WVT_DefColorB('B',WVT_RGB(BLUE))
      WVT_DefColorB('BG',WVT_RGB(CYAN))
      WVT_DefColorB('B+',WVT_RGB(BRIGHT_BLUE))
      WVT_DefColorB('R+',WVT_RGB(WHITE)) //COL_REF
      WVT_DefColorB('RB+',WVT_RGB(BLACK)) //COL_REF1
      WVT_DefColorB('GR+',WVT_RGB(GRAY)) //COL_REF2
      WVT_DefColorB('G+',WVT_RGB(WHITE)) //для меню
   CASE nPalette==1 //Веселенькая
      WVT_DefColorB('B',WVT_RGB( 0x33,0x66 ,0x99  ))
      WVT_DefColorB('BG',WVT_RGB( 0x00,0x99 ,0xCC ))
      WVT_DefColorB('B+',WVT_RGB( 0x33,0x66 ,0xFF ))
      WVT_DefColorB('R+',WVT_RGB( 210,230,250)) //COL_REF
      WVT_DefColorB('RB+',WVT_RGB( 0x31,0x6A,0xC5)) //COL_REF1
      WVT_DefColorB('GR+',WVT_RGB( 0x31,0x6A,0xC5)) //COL_REF2
      WVT_DefColorB('G+',WVT_RGB(0xC6,0xC6,0xC6)) //для меню

ENDCASE
******************/
RETURN


STATIC FUNCTION PaletteInfo()
/*********
LOCAL nBlue:=WVT_DefColorB('B')
DO CASE
   CASE nBlue=RGB(BLUE)
   RETURN 0
ENDCASE
***********/
RETURN 0 //1










FUNCTION OrdBagNameB(n)
LOCAL cDbf:=dbinfo(10)
LOCAL cBag:=OrdBagName(n)
LOCAL cPath:=IF("B4P"$UPPER(cBag),m->GlobalTmpPath,LEFT(cDbf,RAT("\",cDbf)))
LOCAL cName:=TRIM(cPath+cBag)
LOCAL cRet:=""

IF FILE( cRet := cName+OrdBagExt() )
   RETURN cRet
ELSEIF FILE( cRet := cName+".CDX")
   RETURN cRet
ELSEIF FILE( cRet := cName+".IDX" )
   RETURN cRet
ENDIF
RETURN ""

FUNCTION OrdBagNameA(n)
LOCAL cc:=OrdBagNameB(n)
RETURN SUBSTR(cc,RAT("\",cc)+1)




Function NNETSTAID()
Local aInfo := HWINFONETADAPTERS()
Local cID
Local cRet,i

  if !Empty(aInfo)
     cRet := ''
     cID := aInfo[1][3]
     For i := 1 To Len(cID)
         cRet += HB_NUMTOHEX(ASC(cID[i]))
     next
     cRet := PADL(cRet,12,'0')
   else
     cRet := Space(12)
  endif
Return cRet


FUNCTION XRUN(cRun)
LOCAL xRet
//IF HB_GT_VERSION()$"GTWVT"
//   WVT_MINIMIZE()
//ENDIF
xRet:=__RUN(cRun)

//IF HB_GT_VERSION()$"GTWVT"
//   WVT_MAXIMIZE()
//ENDIF
RETURN xRet


FUNCTION CWSWAP(cRun)
RETURN __RUN(cRun)

FUNCTION SWPRUNCMD(cRun)
RETURN __RUN(cRun)


FUNCTION NUMDISKL_()
RETURN 25


FUNCTION Mouse(lSet)
LOCAL cMouse := Upper(GETENV('BEST_MOUSE'))
IF !EMPTY(cMouse).AND.cMouse[1]="F"
   RETURN .T.
ENDIF
MSetCursor(lSet)
RETURN .T.

FUNCTION sx_RLock()
RETURN Reclock()

FUNCTION sx_unLock()
RETURN DbUnlock()


FUNCTION sx_Pack()
RETURN __dbPack()

Function DBOpenBase( xBases, cMessage, lExc, lRO, NoProcess, NoClearState, lFile)
RETURN DBOpenBases( xBases, cMessage, lExc, lRO, NoProcess, NoClearState, lFile)

Function DBCloseBase( xBases, cMessage, NoProcess)
RETURN DBCloseBases( xBases, cMessage, NoProcess)

FUNCTION DiskChange_(v)
LOCAL cDisk:=DiskName()
IF UPPER(v)==UPPER(cDisk)
   RETURN .T.
ENDIF
RETURN (DirChange(v+":\")==0)

FUNCTION TruePath(cPath)
// Сделаем путь полным
#ifdef __PLATFORM__Linux
  IF LEFT(cPath,1) <> '/'
     cPath := '/'+IIF(EMPTY(CURDIR()), '', CURDIR()+'/' )+cPath
  ENDIF
#else
IF AT( ':', cPath) <>  2.AND.LEFT(cPath,2)!="\\"
  IF LEFT(GlobalTmpPath,1) <> '\'
     cPath := '\'+IF(EMPTY(CURDIR()), '', CURDIR()+'\' )+cPath
  ENDIF
  cPath := DISKNAME()+':'+cPath
ENDIF
#endif
RETURN cPath

PROCEDURE HELP
RETURN


#define NormalMode 0
#define InsertMode 1
#define InvertMode(aa) (aa:=(aa + 1) % 2)
#define NormalColor   "w+/b"
#define SelectedColor "b+/w"
#define InsertColor   "gr+/b"
#define SelInsColor   "gr+/w"
#define Normal1Color  "bg+/b"
#define FName 1
#define FDate 3
#define FAttr  5
#define Mode  6
#define slash '\'
#define exit_cat '..'
#define OFF 0
#define all_files "*.*"

****************************************************************************
*   Функция:     select_files                                              *
*   Назначение:  позволяет пользователю выбрать файлы из                   *
*                предложенного списка.                                     *
*   Параметр:    <путь>  - полное имя подкаталога для выбора               *
*                          файлов                                          *
*                cMaska  - Шаблон для выбора по расширениям "DBF"          *
*                          или {"DBF","CDX"};                              *
*                F_Relat - Флаг выбора только в нижележащих директориях с  *
*                          их возвратом                                    *
****************************************************************************
FUNCTION select_files (nT,nL,path, cMaska, F_Relat,lOnlyName)

  local aRes:={}, aDirect:={{}}, oBrowse, nHigh, nWidth, nPos, oColumn, nLen,;
        cOldColor := SetColor (NormalColor), not_exit, lChoice, nKey,;
        selected_entries, res_path, nPlen, nOldCol:=col(), nOldRow:=row(),;
        cOldScreen, nOldCursor:=SetCursor (OFF), aWork,cFiles,cHead

  Local cMaska_
  Local PathRel

  LOCAL aDirWrem := {},;
        aDisk := {}


  IF VALTYPE(nT)=="C" //значит это заголовок
     cHead:=nT
  ENDIF

   nT:=2;nL:=0



  // Загрузим список доступных дисков
  SpisokDiskov( aDisk )
  nHigh:=21               && Высота псевдо-окна просмотра списка файлов
  nWidth:=80              && Ширина псевдо-окна
  F_Relat := if( ValType(F_Relat)=="L",F_Relat,.F.)
  cMaska_ := IF( cMaska == NIL , "", cMaska )
  IF( ValType( cMaska_ ) <> 'A', cMaska_ := {cMaska_}, )
  path:=iif (path = Nil, slash + CurDir (), OemToAnsi(path))  && проверка и присвоение значения по
                                                   && умолчанию для пути поиска
  IF RIGHT(path,1)=="\"
     path:=LEFT(path,LEN(path)-1)
  ENDIF
  PathRel := Path  // Сохраним стартовый путь для варианта F_Relat -> .T.
  not_exit:=.T.
  cOldScreen:=SaveScreen ()

  IF cHead!=NIL
     ScrTitul(1,cHead)
  ENDIF

  ScrTitul(24,"Enter:Выбор Tab:Перенос")


  * Создание псевдо-окна
  @ nT, nL clear to  nT + nHigh, nL + nWidth
  @ nT, nL to  nT + nHigh, nL + nWidth

  * Создание таблицы (объекта) для просмотра
  oBrowse:=TBrowseNew (nT + 1 , nL + 2, nT + nHigh - 2, nL + nWidth - 2)

  * Создание колонки просмотра списка файлов

  oColumn:=TBColumnNew ('', {|| iif (nPos > nLen, space (nWidth-4),;
              padr( AnsiToOem(aDirect [nPos, FName]), nWidth-13) +;
                    iif ("D"$aDirect [nPos, FAttr],     '   <папка>',;
                         IF("V"$aDirect [nPos, FAttr], '    <диск>',;
                            dtoc (aDirect [nPos, FDate]))))})


//  oColumn:heading:='   Файл        Дата' //заголовок колонки
//  oColumn:headSep:=replicate ('─', nWidth - 2)
  oColumn:footing:=replicate ('─', nWidth - 2)

  * Добавление колонки в таблицу для просмотра списка файлов
  oBrowse:AddColumn (oColumn)

  * Установка таблицы цветов для TBrowse
  oBrowse:colorSpec:=NormalColor + ',' + SelectedColor +','+;
                     InsertColor + ','+ SelInsColor+ ','+ Normal1Color

  * Инициализация блока кода для упpавлением цветом в колонке пpосмотpа
  oColumn:colorBlock:={|| iif (nPos <= nLen, iif (aDirect [nPos, Mode] = InsertMode,;
                                   {3,4},IF("D"$aDirect[nPos,FAttr],{1,2},{5,2})), {1, 1})}

  * Инициализация блоков кода для движения по массиву оглавления
  oBrowse:GoTopBlock:={|| nPos:=1}        && Переход на начало списка файлов
  oBrowse:GoBottomBlock:={|| nPos:=nLen}  && Переход на конец списка
  oBrowse:SkipBlock:={|nSkip| nSkip:=iif (nSkip + nPos > nLen, nLen - nPos,;
                               iif (nSkip + nPos < 1, 1 - nPos, nSkip)),;
                          nPos:=nPos + nSkip, nSkip}  && Пропуск nSkip строк

  do while not_exit

    res_path:=path + slash + all_files   && Полный путь поиска
    aDirect:=directory (res_path, 'D')   && Формирование массива, содержащего
                                         && информацию о файлах подкаталога
    IF LEN( cMaska_ ) <> 0
      aDirWrem := {}


      AEVAL( aDirect, {|x,jj|IF("D"$x[FAttr],aDirect[jj,FAttr]:="D",aDirect[jj,FAttr]:="A"),;
      IF(EMPTY(cMaska).OR. ASCAN( cMaska_, UPPER(RIGHT(x[FName], 3))) <> 0 ;
                             .OR.                      ;
                              x[FAttr] == "D" ,         ;
                              (AADD( aDirWrem, x )),;
                        NIL ) } )


      aDirect := aDirWrem
    ELSE
       AEVAL(aDirect,{|x,jj|IF("D"$x[FAttr],aDirect[jj,FAttr]:="D",aDirect[jj,FAttr]:="A"),aDirect[jj,FName]:=x[FName]})
    ENDIF


    * Отображение пути поиска в предпоследней строке псевдо-окна
    res_path:=if ((nPlen:=len (path)) > nWidth - 10,;
                   '...' + substr (path, nPlen - nWidth + 15, nPlen), path)

    * Очистка информации о предыдущем подкаталоге
    @ nT + 3 , nL + 2 clear to nT + nHigh - 3, nL + nWidth - 2

    * Подготовка файлового массива к работе
    aeval (aDirect, {|aElem| if (len (aElem [FAttr]) = 0, aElem [FAttr]:= 'A', nil),;
                     aAdd (aElem, NormalMode)}) && Корректировка нестандартных
                                                && атрибутов файлов и добавление
                                                && информации о состоянии каждого
                                                && файла.
    IF LEN(aDirect)<>0 .AND. aDirect[1][FName] == "."
       aSize (aDel (aDirect, 1), len (aDirect) - 1)
    ENDIF






    // Добавим выход на ВЕРХ для сети
    IF !EMPTY(Path) .AND.  RIGHT( Path,1) <> ':' .AND. ;
                           ASCAN( aDirect, {|x| x[FName]==".."}) == 0
       aSize( aDirect, len(aDirect) + 1)
       AINS( aDirect, 1)
       aDirect[1] := { '..',  0, DATE(), TIME(),  'D', 0 }
    ENDIF


    * Сортировка полученного массива по убыванию с перестановкой имен
    * подкаталогов на первое место

//    aDirect:=aSort (aDirect,,,{|x,y|CHR(256-ASC(UPPER(x[FAttr])))+UPPER(x[FName]) < CHR(256-ASC(UPPER(y[FAttr])))+UPPER (y[FName])})
      ASORT(aDirect,,,{|x,y|SortFunc(x)<SortFunc(y)})
    // Добавим для первого уровня ДИСКИ
    IF EMPTY(Path) .OR. RIGHT( Path,1) == ':'
      AEVAL( aDisk, {|x| AADD( aDirect, { x+':',  0, DATE(), TIME(),  'V', 0 })} )
    ENDIF

    nLen:=len (aDirect)    && Длина полученного массива
    lChoice:=.T.           && Условие для продолжения
    selected_entries:=0    && Инициализация количества выделенных файлов
                           && в данном подкаталоге
    nPos:=1                && Инициализация позиции курсора на экране
    oBrowse:goTop()        && Переход на первый файл в списке


    @ nT + nHigh - 1, nL + 2 say padr ('Поиск =>' + AnsiToOem(res_path), nWidth - 2, .T.)

    * Работа с текущим подкаталогом
    do while lChoice
      * Стабилизация объекта на экране
      nKey:=0
      do while .not. oBrowse:stabilize .and. nKey = 0
        nKey:=inkey ()
      enddo
      nKey:=iif (nKey = 0, inkeytrap (0), nKey)
      do case
      case nKey = K_ENTER     // Если нажата клавиша Enter

                 lChoice:=.F.       // прекращаем работу с данным подкаталогом
                 if "D"$aDirect [nPos, FAttr].OR."V"$aDirect [nPos, FAttr]   // если необходим переход в другой
                                                   // подкаталог
                    Selected_Entries := 0          // сбрасываем информацию о выбранных
                                                   // файлах
                    //  проверяем имя каталога  куда необходимо перейти
                    if aDirect [nPos, FName] = exit_cat  // ..
                       Path := if( F_Relat .AND.( Len(PathRel) > Len(SubStr( Path, 1, Rat( slash, Path ) - 1 ))),;
                                    PathRel,;
                                    SubStr( Path, 1, Rat( slash, Path ) - 1 );
                                 )
                    elseif "V"$aDirect[nPos,FAttr].AND. !F_Relat // Переход на диск
                       Path := aDirect[nPos,FName]
                    else
                       Path := Path + slash + aDirect[ nPos, FName]
                    endif
                    oBrowse:refreshAll()         // сообщение о необходимости
                                                 // обновления информации на экране
                 else  // завершение работы программы
                    Not_Exit:=.F.
                    if Selected_Entries == 0     // если файлы не отмечены,
                                                 // помечаем текущий файл
                       InvertMode(aDirect [nPos, Mode])
                    endif
                 endif

        case nKey == K_TAB .AND. Empty( cMaska ) // Если нажата клавиша Тав
                 /* Выбор значения пути */
                 Path := Path + slash
                 lChoice := Not_Exit := .F.  // завершение работы функции
        case nKey == K_ESC   && Если нажата клавиша Esc
          aeval (aDirect, {|aElem| aElem [Mode]:=NormalMode}) && сброс пометки
                                                              && файлов
          lChoice:=not_exit:=.F.  && завершение работы функции
        case nKey == K_UP    && клавиша "вверх", переход на строку вверх
          oBrowse:Up()
        case nKey = K_DOWN   && клавиша "вниз", переход на строку вниз
          oBrowse:Down()
        case nKey == K_PGUP    && клавиша "вверх", переход на строку вверх
          oBrowse:PageUp()
        case nKey = K_PGDN   && клавиша "вниз", переход на строку вниз
          oBrowse:PageDown()
        case nKey == K_HOME  && клавиша "home", переход на начало списка
          oBrowse:goTop()
        case nKey == K_END   && клавиша "end", переход на конец списка
          oBrowse:goBottom()
        case nKey == K_INS .and. !"D"$aDirect [nPos,FAttr] && если нажата
                                                              && клавиша Insert
          InvertMode (aDirect [nPos, Mode])  && Меняем пометку текущего файла
          oBrowse:refreshCurrent()           && смена цвета отмеченного файла
          iif (aDirect [nPos, Mode] = InsertMode,;  && корректировка счетчика
                          selected_entries++, selected_entries--)
          oBrowse:Down()     && переход на имя следующего файла
      endcase
    enddo
  enddo
  * Создание результирующего массива
  aeval (aDirect, {|aElem| iif (aElem [Mode] == InsertMode,;
                               aAdd (aRes, AnsiToOem(IF(lOnlyName==NIL.OR.!lOnlyName,path + slash,"") + aElem [FName])), nil)})
  RestScreen (,,,,cOldScreen)  && восстановление
                                             && предыдущей информации на экране
  devpos (nOldRow, nOldCol)  && восстановление прежнего положения курсора
  SetColor (cOldColor)       && восстановление прежнего цвета
  SetCursor (nOldCursor)     && восстановление прежнего состояния курсора


return if(cMaska == NIL, AnsiToOem(Path), aRes)


PROCEDURE SpisokDiskov(aDisk)
LOCAL aDisk0:=AllDrives(),i
FOR i := 1 TO LEN(aDisk0)
AADD(aDisk, aDisk0[i])
NEXT
RETURN


FUNCTION NextDisk()
  LOCAL aDisk  := {}, i, nChoice
  LOCAL aSet := SaveSet(),cNewDisk:='',aSetKeys := SaveSetKey()
  SpisokDiskov( aDisk )
  AEVAL( aDisk, {|x,xi| aDisk[xi] := "   Диск  -  "+x+":  "} )
   nChoice :=BoxMenu(" Выберите диск ",3,2,      ;
                 aDisk,,                          ;
                 nChoice                          ;
                     )
    IF nChoice <> 0
      cNewDisk := SUBSTR(aDisk[nChoice],13,1)
    ENDIF
  RestSetKey(aSetKeys)
  RestSet(aSet)
RETURN ( cNewDisk )



FUNCTION LoadWinShablon(cPath0,cExt)
LOCAL nGet:=CurrentGet()
LOCAL nLen:=LEN(aIn[nGet])
LOCAL cDir:=IF(EMPTY(cPath0),LoadPath()+"Main\Template",cPath0)
LOCAL aFile,cFile

altd()
cExt:=IF(EMPTY(cExt),".FRF",cExt)
aFile := Select_Files( 3, 2, cDir, {UPPER(SUBSTR(cExt,2))})
IF VALTYPE(aFile)="A".AND.!EMPTY(aFile)
    cFile:=ALLTRIM(aFile[1])
ENDIF
IF !EMPTY(cFile)
  m->aIn[nGet]:=PADR(SUBSTR(cFile,RAT("\",cFile)+1),nLen)
ENDIF
RETURN .T.




FUNCTION DiskFree_(v)
IF IsMSNT()
   RETURN DiskFree(v)
ENDIF
RETURN 99999999999999999 //под 98-ошибку дает, если запуска с сети с ярлыка

STATIC FUNCTION SortFunc(x)
LOCAL c:=IF("D"$UPPER(x[FAttr]),"1","2")
LOCAL cc1:="._"
LOCAL cc2:=CHR(01)+CHR(13)
LOCAL cc:=CHARREPL(cc1,UPPER(x[FName]),cc2)
RETURN c+cc


FUNCTION CreateTempIndex(cNtxKey,cForKey,cNameTag)
// Создание временных индексов
// Только по одному тэгу в бэге
Local nStep
Local cTagName
Local nProces:=Proces_Ini(,17,,'Построение вспомогательного индекса')
Local n, bForKey, bNtxKey, aIndex, nPoz
Local cNameNtx := TempFile(m->GlobalTmpPath,'CDX')
nStep := IIf(LastRec()==0,1,INT( 54/LASTREC()))
cNameTag := If(cNameTag==NIL, "TMP_TAG", cNameTag)
cForKey := IF(EMPTY(cForKey),"!DELETE()"+IF(FieldPos("DELETE") != 0,".AND.!DELETE","")+IF(FieldPos("ARXIV") != 0,".AND.!ARXIV",""),"!DELETE() .AND."+IF(FieldPos("DELETE") != 0,"!DELETE.AND.","")+IF(FieldPos("ARXIV") != 0,"!ARXIV.AND.","")+" ("+cForKey+")")
SetKeyIndex(@cForKey,@cNtxKey,@bForKey,@bNtxKey)
IF (nPoz := ASCAN(aIndex := BsSaveIndex(),{|cNameIdx| UPPER(cNameIdx) == UPPER(cNameNtx) })) != 0
  ADEL(aIndex,nPoz)
  ASIZE(aIndex,LEN(aIndex)-1)
  BsClearIndex()
  BsRestIndex(aIndex)
ENDIF
FERASE(cNameNtx)

dbGoTop()
ordCondSet(cForKey,bForKey,NIL,,;
,;
1,RECNO(),,,.T.,,.F.,,.T., .F., .F., .T., .F., .F.)

IF(cTagName = NIL,cTagName := TOKEN(TOKEN(UPPER(cNameNtx),":\"),".",1),NIL)
ordCreate(cNameNtx,cTagName,cNtxKey,bNtxKey)

ORDSETFOCUS(cTagName)

DBGOTOP()
ReopenDbf()
Proces_End(nProces)
RETURN cNameNtx


FUNCTION Div(n1,n2)
IF n1=NIL.OR.n2=NIL
   RETURN NIL
ENDIF
RETURN IF(n2=0,0,n1/n2)



PROCEDURE EraseDir(cPath)
LOCAL aFiles,i,cCurPath := CurDir()
//altd()
cPath:=ALLTRIM(cPath)
IF RIGHT(cPath,1)!="\"
   cPath+="\"
ENDIF
IF DirChange(Alltrim(cPath))==0
   aFiles := DIRECTORY(,"DHS")
   IF LEN(aFiles)>0
      FOR i := 1 TO LEN( aFiles )
      IF aFiles[i,1] <> '.'
         IF "D"$aFiles[i,5]
             EraseDir(aFiles[i,1]+"\")
         ELSE
             SetFATTR(TRIM(aFiles[i,1]),32) //FA_ARCH
             FERASE(TRIM(aFiles[i,1]))
         ENDIF
      ENDIF
      NEXT
   ENDIF
ENDIF
DirChange("\"+cCurPath)
DirRemove(cPath)
RETURN





FUNCTION MydbUnLockAll()
RETURN dbUnlockAll()