ChangeLog 19991012-10:38

This commit is contained in:
Ryszard Glab
1999-10-12 08:43:53 +00:00
parent 402417af15
commit 99e78eb014
7 changed files with 4101 additions and 0 deletions

View File

@@ -1,3 +1,9 @@
19991012-10:38 GMT+2 Ryszard Glab <rglab@imid.med.pl>
*samples/pe
* new directory with a sample editor that can be used as a base for
MEMOEDIT and TEditor class
19991012-00:52 EDT Paul Tucker <ptucker@sympatico.ca>
* makefile.vc
+ source/rtl/input.prg

View File

@@ -0,0 +1,25 @@
#
# $Id$
#
ROOT = ../../
PRG_SOURCES=\
editorhi.prg \
C_SOURCES=\
editorlo.c \
PRG_MAIN=pe.prg
LIBS=\
runner \
tools \
debug \
rdd \
vm \
rdd \
rtl \
pp \
include $(TOP)$(ROOT)config/bin.cf

View File

@@ -0,0 +1,691 @@
/*
* $Id$
*/
//#include "expand.ch"
//#include "windows.ch"
//#include "print.ch"
//#include "helpsys.ch"
#include <inkey.ch>
#include <setcurs.ch>
#include <fileio.ch>
#include <box.ch>
#define EXPORT
#define IFANY( x ) IF( (x) != NIL )
#define IFNIL( x ) IF( (x) == NIL )
#define IIFNIL( isnil, notnil ) IIF(notnil==NIL, isnil, notnil)
#define EDIT_LOWER 0 // convert to lowercase
#define EDIT_UPPER 1 // convert to uppercase
#define EDIT_SAME 2 // no convertion
#define EDIT_HARD 13 // hard cariage
#define EDIT_SOFT 141 // soft cariage
#define EDIT_EDIT .T. // full edit mode
#define EDIT_VIEW .F. // view only mode
// The editor structure
//
#define E_EDIT 1 // index returned be ED_NEW
#define E_TOP 2 // position on the screen
#define E_LEFT 3
#define E_BOTTOM 4
#define E_RIGHT 5
#define E_TITLE 6 // title
#define E_COLOR 7 // used colors set
#define E_FRAME 8 // frame around the editor
#define E_LINELEN 9 // maximal line length
#define E_MODE 10 // editor mode (edit/view)
#define E_CARGO 11 // cargo slot
#define E_STRUCT_LEN 11
STATIC nESize:=4096 // default buffer size
STATIC oEditor // static variable used to speed access to the editor
STATIC aEdit:={ } // the stack of used editors
STATIC lInsert //current Insert state
//
**
//
//---------------------------------------------------------
//03-06-93 07:52pm
//
// nTop, nLeft, nBottom, nRight - position on the screen
// nLength - the line length
// cFrame - the frame to be drawed around the editor
// cTitle - comment displayed in upper, left corner
// cColor - colors used to draw the editor
// nSize - the size of memory buffer that holds the edited text - the buffer
// will not grow at current design
// nEscape - the character code used as a marker of color highlighing
// For example if its value is 126 '~' then the following text:
// normal text ~2text in bold~1 back to normal text
// will be displayed with 'text in bold' highlighted using the second
// color specified by 'cColor' parameter
//
EXPORT FUNCTION EditorNew( nTop, nLeft, nBottom, nRight, nLength, ;
cFrame, cTitle, cColor, nSize, nEscape )
LOCAL nEdit, oEdit
IF( nLength == NIL )
nLength =80
ENDIF
nEdit =ED_New( nLength, 4, IIFNIL(nESize, nSize), nEscape )
IF( nEdit >= 0 )
oEdit :=ARRAY( E_STRUCT_LEN )
oEdit[E_EDIT] =nEdit
oEdit[E_TOP] =nTop
oEdit[E_LEFT] =nLeft
oEdit[E_BOTTOM] =nBottom
oEdit[E_RIGHT] =nRight
oEdit[E_LINELEN] =nLength
oEdit[E_FRAME] =IIFNIL( B_DOUBLE, cFrame )
oEdit[E_TITLE] =cTitle
oEdit[E_COLOR] =IIFNIL( "W/N,W+/N,W+/R,GR+/N,G+/N", cColor )
oEdit[E_MODE] =EDIT_VIEW
ED_Config( nEdit, nTop, nLeft, nBottom, nRight, 0, 0 )
ENDIF
RETURN( oEdit )
//---------------------------------------------------------
//03-06-93 09:16pm
//
EXPORT PROCEDURE EditorKill( oEdit )
ED_Kill( oEdit[E_EDIT] )
MEMORY( -1 )
RETURN
//---------------------------------------------------------
//96-02-29 22:22
//
EXPORT PROCEDURE EditorUnlock( oEdit )
ED_Unlock( oEdit[E_EDIT] )
RETURN
//---------------------------------------------------------
//03-06-93 10:20pm
//
EXPORT FUNCTION EditorCargo( oEdit, xCargo )
LOCAL _xCargo:=oEdit[E_CARGO]
IFANY( xCargo )
oEdit[E_CARGO] =xCargo
ENDIF
RETURN( _xCargo )
//---------------------------------------------------------
//19-07-93 01:08am
//
EXPORT FUNCTION EditorTitle( oEdit, cTitle )
LOCAL _cTitle:=oEdit[E_TITLE]
IFANY( cTitle )
oEdit[E_TITLE] =cTitle
ENDIF
RETURN( _cTitle )
//---------------------------------------------------------
//04-06-93 02:18am
//
// Sets
// EDIT_EDIT - full edit mode
// EDIT_VIEW - view only mode (no changes in text are allowed)
//
EXPORT FUNCTION EditorMode( oEdit, lMode )
LOCAL _lMode:=oEdit[E_MODE]
IFANY( lMode )
oEdit[E_MODE] =lMode
ENDIF
RETURN( _lMode )
//---------------------------------------------------------
//28-05-92 09:31am
//
EXPORT FUNCTION EditorSize( nSize )
LOCAL _nSize:=nESize
IF nSize != NIL
nESize =nSize
ENDIF
RETURN( _nSize )
//---------------------------------------------------------
//28-02-92 10:57pm
//
// Appends passed text to the text already stored in editor
//
EXPORT PROCEDURE EditorAddText( oEdit, cText )
ED_AddText( oEdit[E_EDIT], cText )
RETURN
//---------------------------------------------------------
//05-03-92 10:21pm
//
// Sets new text in editor
//
EXPORT PROCEDURE EditorSetText( oEdit, cText )
ED_SetText( oEdit[E_EDIT], cText )
RETURN
//---------------------------------------------------------
//05-03-92 10:23pm
//
// Inserts passed text into editor starting from passed line number
//
EXPORT PROCEDURE EditorInsText( oEdit, cText, nLine )
LOCAL nNum:=IIFNIL( ED_LCount(oEdit[E_EDIT]), nLine )
ED_InsText( oEdit[E_EDIT], cText, nNum )
RETURN
//---------------------------------------------------------
//02-03-92 07:53pm
//
// Retrieves the text from editor
// nUpper - specifies if text should be changed to uppercase, lowercase
// or unchanged
// nCarret - specifies if soft carriage return (141/10) should be replaced by
// hard carriage returns (13/10)
//
EXPORT FUNCTION EditorGetText( oEdit, nUpper, nCarret )
IFNIL( nUpper )
nUpper =EDIT_SAME
ENDIF
IFNIL( nCarret )
nCarret =EDIT_HARD
ENDIF
RETURN( ED_GetText( oEdit[E_EDIT], nUpper, nCarret ) )
//---------------------------------------------------------
//04-03-92 02:35pm
//
// Returns the line count stored in editor
//
EXPORT FUNCTION EditorLCount( oEdit )
RETURN( ED_LCount( oEdit[E_EDIT] ) )
//---------------------------------------------------------
//06-03-92 07:09pm
//
// Returns the specified line of text from the editor
//
EXPORT FUNCTION EditorGetLine( oEdit, nLine )
RETURN( ED_GetLine( oEdit[E_EDIT], nLine ) )
//---------------------------------------------------------
//06-03-92 07:10pm
//
// Returns the next line of text
//
// It can be used:
// nLCount :=EditorLCount( oEdit )
// cLine :=EditorGetLine( oEdit, 1 )
// FOR i:=2 TO nLCount
// cLine :=EditorNextLine( oEdit )
// NEXT
//
EXPORT FUNCTION EditorNextLine( oEdit )
RETURN( ED_GetNext(oEdit[E_EDIT]) )
//---------------------------------------------------------
//03-06-93 10:11pm
//
// Edit the specified file
//
// xInput - the filename to edit or a handle to a file retrned by FOPEN
// cOutput - the name of the file created in 'save' operation
// nLineLen - the line length
// nHelp - the index into help subsystem
// lPrint - specifies if edited file can be printed
// lConv - it was used to convert some unprintable characters
// nEscape - the code of color escape character
// lSave - specifies if edited file can be saved under a different name
//
EXPORT FUNCTION EditorFile( xInput, cOutput, nLineLen, nHelp, ;
lPrint, lConv, nEscape, lSave )
LOCAL nHandle, nLen, oEdit, bF2, bF8, oHelp, lSaved:=.F., lClose:=.F.
LOCAL nSize
IF( lSave == NIL )
lSave =.T.
ENDIF
IF( VALTYPE(xInput) == 'C' )
nHandle =FOPEN( xInput )
lClose =.T.
ELSE
nHandle =xInput
ENDIF
IF( nHandle > 0 )
nLen =MAX( FileLength( nHandle ), nESize )
ELSE
nLen =nESize
ENDIF
nSize =IIF( nLen < 8192, nLen*2, INT(nLen*1.5) )
oEdit =EditorNew( 01,00,23,79, nLineLen, '--- ', cOutput, , ;
nSize, nEscape )
IF( nHandle > 0 )
ED_ReadText( oEdit[E_EDIT], nHandle, 0, nLen, ;
IIF( lConv==NIL, .F., lConv ) )
IF( lClose )
FCLOSE( nHandle )
ENDIF
ELSE
EditorSetText( oEdit, ' ' )
ENDIF
EditorCargo( oEdit, cOutput )
// SAVELINE 24 TO oHelp WITH 80, ColorHelp( ,COLOR_EXTEND )
// IF( lSave )
// DisplayHelp( 73 ) //F2-save
// bF2 =SETKEY( K_F2, {|oE| lSaved:=EditorSave(oE)} )
// ENDIF
// IF( lPrint != NIL .AND. lPrint )
// DisplayHelp( 74 ) //F8-print
// bF8 =SETKEY( K_F8, {|oE| EditorPrint(oE)} )
// ENDIF
lSaved :=EditorEdit( oEdit, EDIT_EDIT, .F., nHelp )
EditorKill( oEdit )
IF( lSave )
SETKEY( K_F2, bF2 )
ENDIF
// IF( lPrint != NIL .AND. lPrint )
// SETKEY( K_F8, bF8 )
// ENDIF
// RESTLINE FROM oHelp
// FT_IDLE()
MEMORY(-1)
RETURN( lSaved )
//---------------------------------------------------------
//06-07-93 06:05pm
//
// Reads a text from a file into the editor
//
// oEditor - existing editor
// nHandle - handle to an open file to read from
// nOffset - the starting offset
// nLen - the number of characters to read
// lConv - specifies if some unprintable characters should be converted
// (NOTE: it was used to allow display charcters with ASCII code 27 and 26)
//
EXPORT FUNCTION EditorRead( oEditor, nHandle, nOffset, nLen, lConv )
RETURN( ED_ReadText( oEditor[E_EDIT], nHandle, nOffset, nLen, ;
IIF( lConv==NIL, .T., lConv ) ) )
//---------------------------------------------------------
//03-06-93 08:31pm
//
// Start the editor
//
// oEdit - the editor object
// lEdit - .T. = edit allowed, .F. = view only mode
// lFrame - specifies if the frame around the editor should be displayed
// nHelp - the help index into help subsystem
//
EXPORT FUNCTION EditorEdit( oEdit, lEdit, lFrame, nHelp )
LOCAL nRow:=0, nCol:=0, nKey, cLine, bKey, oBox, nCursor, nState
LOCAL nTop, nLeft, nBottom, nRight
LOCAL lSaveAllowed, lSaved:=.F.
//HELPSAVE( IIF(nHelp==NIL, H_EDITOR, nHelp ) )
oBox =SAVEBOX( oEdit[E_TOP], oEdit[E_LEFT], ;
oEdit[E_BOTTOM], oEdit[E_RIGHT], ;
oEdit[E_COLOR], oEdit[E_FRAME], oEdit[E_TITLE], .F. )
lInsert =SET( _SET_INSERT )
// SayInsert()
nCursor =SetCursor( IIF(lInsert, SC_NORMAL, SC_SPECIAL1) )
IFANY( lEdit )
oEdit[E_MODE] =lEdit
ENDIF
lSaveAllowed :=( SETKEY(K_F2) == NIL )
// IF( lSaveAllowed )
// DisplayHelp( 73 ) //F2-save
// ENDIF
nTop =oEdit[E_TOP] +1
nLeft =oEdit[E_LEFT] +1
nBottom =oEdit[E_BOTTOM] -1
nRight =oEdit[E_RIGHT] -1
IF( lFrame != NIL .AND. !lFrame )
nLeft--
nBottom++
nRight++
ENDIF
nState =oEdit[E_RIGHT] -8
/* It uses static variable 'oEditor' to speed access to the editor
If this function is called recursively then we have to push
currently used editor on the stack
*/
EditorPush( oEdit )
/* The position of the editor can be changed (in a windowed environment)
then it sets current position of editor.
It also sets the current editor as the working one. This means that
all next ED_* functions will used the editor handle specified
by oEditor[E_EDIT] - it is tricky solution to speed access (we
don't need to pass the editor handle with every ED_*() call
(Well... this editor was created when AT-286 computers worked in
its full glory :)
*/
ED_Config( oEditor[E_EDIT], nTop, nLeft, nBottom, nRight, 0, 0 )
DO WHILE .T.
nRow =ED_Stabilize() //displays all visible lines
// It don't uses incremantal stabilization for performance reasons
IF( nRow != ED_Row() )
nRow =ED_Row()
@ oEditor[E_TOP], nState SAY STRZERO( nRow,4 )
ENDIF
IF( nCol != ED_Col() )
nCol =ED_Col()
@ oEditor[E_TOP], nState+5 SAY STRZERO( nCol,3 )
ENDIF
SETPOS( nTop+ED_WinRow(), nLeft+ED_WinCol() )
// nKey =WaitForKey()
nKey =INKEY(0)
DO CASE
CASE( nKey>=32 .AND. nKey<256 )
IF( oEdit[E_MODE] )
ED_PutChar( nKey, lInsert )
ENDIF
CASE( nKey == K_F2 .AND. lSaveAllowed )
lSaved :=EditorSave( oEditor ) //save the copy of edited buffer
CASE( EditorMove( nKey ) )
CASE( nKey == K_DOWN )
IF !ED_Down()
SCROLL( nTop, nLeft, nBottom, nRight, 1 )
ENDIF
CASE( nKey == K_UP )
IF !ED_Up()
SCROLL( nTop, nLeft, nBottom, nRight, -1 )
ENDIF
CASE( nKey == K_ESC )
EXIT
OTHERWISE
bKey =SETKEY( nKey )
IFNIL( bKey )
IF( oEdit[E_MODE] )
EditorKeys( nKey )
ENDIF
ELSE
EVAL( bKey, oEditor )
ENDIF
ENDCASE
ENDDO
EditorPop() //restore the proviously used editor
SetCursor( nCursor )
RESTBOX( oBox )
// HELPREST.
// FT_IDLE()
MEMORY(-1)
RETURN( lSaved )
//
**
//
//---------------------------------------------------------
//03-06-93 08:35pm
//
STATIC PROCEDURE EditorKeys( nKey )
LOCAL i
DO CASE
CASE( nKey == K_CTRL_Y )
ED_DelLine()
CASE( nKey == K_CTRL_T )
ED_DelWord()
CASE( nKey == K_DEL )
ED_DelChar()
CASE( nKey == K_BS )
ED_BSpace( lInsert )
CASE( nKey == K_RETURN )
ED_Return( lInsert )
CASE( nKey == K_TAB )
// ED_Tab( lInsert )
FOR i=1 TO 4
ED_PutChar( 32, lInsert )
NEXT
CASE( nKey == K_INS )
lInsert = !lInsert
SET( _SET_INSERT, lInsert )
SetCursor( IIF(lInsert, SC_NORMAL, SC_SPECIAL1) )
// SayInsert()
ENDCASE
RETURN
//---------------------------------------------------------
//04-06-93 02:06am
//
STATIC FUNCTION EditorMove( nKey )
LOCAL lMoved:=.T.
DO CASE
CASE( nKey == K_PGDN )
ED_PgDown()
CASE( nKey == K_PGUP )
ED_PgUp()
CASE( nKey == K_CTRL_PGUP )
ED_Top()
CASE( nKey == K_CTRL_PGDN )
ED_Bottom()
CASE( nKey == K_RIGHT )
ED_Right()
CASE( nKey == K_LEFT )
ED_Left()
CASE( nKey == K_HOME )
ED_Home()
CASE( nKey == K_CTRL_HOME )
ED_Home()
CASE( nKey == K_END )
ED_End()
CASE( nKey == K_CTRL_END )
ED_End()
CASE( nKey == K_CTRL_RIGHT )
// ED_NWord() //there are some problems with it
CASE( nKey == K_CTRL_LEFT )
ED_PWord()
OTHERWISE
lMoved =.F.
ENDCASE
RETURN( lMoved )
//---------------------------------------------------------
//03-06-93 09:11pm
//
STATIC PROCEDURE EditorPush( oEdit )
ED_Push()
AADD( aEdit, oEditor )
oEditor =oEdit
RETURN
//---------------------------------------------------------
//03-06-93 09:12pm
//
STATIC PROCEDURE EditorPop( )
LOCAL nLen
nLen =LEN( aEdit )
oEditor =aEdit[ nLen ]
ASIZE( aEdit, nLen-1 )
ED_Pop()
RETURN
//---------------------------------------------------------
//03-06-93 10:23pm
//
STATIC FUNCTION EditorSave( oEdit )
LOCAL nHandle, cFile, cNew
cFile =EditorCargo(oEdit)
IF( EMPTY(cFile) )
cFile ='TESTFILE.TXT' //GetFileName( 10, 10 )
ENDIF
IF( EMPTY(cFile) )
RETURN( .F. )
ENDIF
/*
WorkStart( 75 )
IF( FILE(cFile) )
cNew =FileExtension( cFile, 'BAK' )
DELETEFILE( cNew )
nHandle =RENAMEFILE( cFile, cNew )
IF( nHandle < 0 )
FileError( cFile, -nHandle )
WorkEnd()
RETURN( .F. )
ENDIF
ENDIF
*/
nHandle =FCREATE( cFile, FC_NORMAL )
IF( nHandle > 0 )
FWRITE( nHandle, EditorGetText(oEdit) )
FCLOSE( nHandle )
// ELSE
// FileError( cFile, FERROR() )
ENDIF
// WorkEnd()
RETURN( nHandle > 0 )
//---------------------------------------------------------
//19-08-93 02:05am
//
/*
STATIC PROCEDURE EditorPrint( oEdit )
LOCAL oParm
IF PrintReady()
PrintNewQue()
PrintSetHead( AppsOwner(), , '-', PRN_OFF )
PrintAddJob( oEdit, PRN_EDITOR )
PrintJob(PRN_OFF)
PrintDelQue()
ENDIF
RETURN
*/
//---------------------------------------------------------
*09/29/91 08:40pm
*
EXPORT FUNCTION SaveBox( top,left,bott,right, kolor, patt, head, shadow )
LOCAL cBox, cClr, nBottom,nRight
IF( PCOUNT() > 4 )
cClr =SETCOLOR(kolor)
cBox =SAVESCREEN(top,left,bott,right)
// cBox =BoxShadow(top,left,bott,right, , patt, head, shadow)
@ top, left, bott, right BOX patt
// nBottom =bott+1
// nRight =right+1
ELSE
cClr =SETCOLOR()
cBox =SAVESCREEN(top,left,bott,right)
nBottom =bott
nRight =right
ENDIF
RETURN( {top,left,nBottom,nRight, cBox, cClr} )
//---------------------------------------------------------
*09/29/91 08:42pm
*
EXPORT PROCEDURE RestBox( oBox )
RESTSCREEN( oBox[1], oBox[2], oBox[3], oBox[4], oBox[5] )
SETCOLOR( oBox[6] )
RETURN
STATIC FUNCTION FileLength( nH )
LOCAL nPos:=FSEEK( nH, 0, FS_RELATIVE )
LOCAL nLen:=FSEEK( nH, 0, FS_END )
FSEEK( nH, nPos, FS_SET )
RETURN( nLen )

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,60 @@
/*
* $Id$
*/
¨2THE HARBOUR PROJECT LICENSE¨1
¨3 ===========================
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, with one exception:
The exception is that if you link the Harbour Runtime Library (HRL)
and/or the Harbour Virtual Machine (HVM) with other files to produce
an executable, this does not by itself cause the resulting executable
to be covered by the GNU General Public License. Your use of that
executable is in no way restricted on account of linking the HRL
and/or HVM code into it.
This program is distributed in the hope that it will be useful,
but ¨2WITHOUT ANY WARRANTY¨1; without even the implied warranty of
¨4MERCHANTABILITY¨1 or ¨5FITNESS FOR A PARTICULAR PURPOSE¨1. 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 (or visit
their web site at http://www.gnu.org/).
¨5This file have to be separated with CR/LF characters¨1

41
harbour/samples/pe/pe.prg Normal file
View File

@@ -0,0 +1,41 @@
/*
* $Id$
*/
#define EDIT_EDIT .T.
#define EDIT_VIEW .F.
PROCEDURE MAIN( cFile )
LOCAL cText
LOCAL lMode:=EDIT_EDIT
IF( cFile == NIL )
cFile ="license.txt"
IF( !FILE(cFile) )
cFile ="../../license.txt"
ENDIF
lMode =EDIT_VIEW
ENDIF
cText =MEMOREAD( cFile )
cText =MEMOEDITOR( cText, 0,0, MAXROW(), MAXCOL(), lMode )
MEMOWRIT( "OUTPUT.TXT", cText )
RETURN
STATIC FUNCTION MEMOEDITOR( cText, nTop, nLeft, nBottom, nRight, lMode )
LOCAL oED
/* NOTE: In current design of editor it doesn't reallocate the memory
buffer used to hold the text
*/
oED :=EditorNew( nTop, nLeft, nBottom, nRight, 254, , , , LEN(cText)*2, 168 )
IF( oED != NIL )
EditorSetText( oED, cText )
EditorEdit( oED, lMode, .T. )
cText :=EditorGetText( oED )
EditorKill( oED )
ELSE
? "Editor not created"
ENDIF
RETURN( cText )

View File

@@ -0,0 +1,19 @@
/*
* $Id$
*/
Known bugs:
----------
1) It requires files separated with CR/LF pairs
2) NextWord() doesn't work correctly
3) If text contains color escape codes then deleting or inserting
of characters doesn't work correctly in the line that contains it
To fix:
------
1) All TAB characters are replaced with spaces at startup - if edited file is
very large and contains many TABs then it can take a vary long time - TAB
characters should be left unchanged and interpreted during editing
2) It reformats whole text at startup - again for a very long text it can
take too much time
3) Text buffer shold be reallocated dynamically
4) Remove static table of created editors