void TEditor::doSearchReplace() { int i; do { i = cmCancel; if( search(findStr, editorFlags) == False ) { if( (editorFlags & (efReplaceAll | efDoReplace)) != (efReplaceAll | efDoReplace) ) editorDialog( edSearchFailed ); } else if( (editorFlags & efDoReplace) != 0 ) { i = cmYes; if( (editorFlags & efPromptOnReplace) != 0 ) { TPoint c = makeGlobal( cursor ); i = editorDialog( edReplacePrompt, &c ); } if( i == cmYes ) { lock(); insertText( replaceStr, strlen(replaceStr), False); trackCursor(False); unlock(); } } } while( i != cmCancel && (editorFlags & efReplaceAll) != 0 ); }
TEditor::TEditor( const TRect& bounds, TScrollBar *aHScrollBar, TScrollBar *aVScrollBar, TIndicator *aIndicator, size_t aBufSize ) : TView( bounds ), hScrollBar( aHScrollBar ), vScrollBar( aVScrollBar ), indicator( aIndicator ), bufSize( aBufSize ), canUndo( True ), selecting( False ), overwrite( False ), autoIndent( False ) , lockCount( 0 ), keyState( 0 ) { growMode = gfGrowHiX | gfGrowHiY; options |= ofSelectable; eventMask = evMouseDown | evKeyDown | evCommand | evBroadcast; showCursor(); initBuffer(); if( buffer != 0 ) isValid = True; else { editorDialog( edOutOfMemory ); bufSize = 0; isValid = False; } setBufLen(0); }
Boolean TFileEditor::valid( ushort command ) { if( command == cmValid ) return isValid; else { if( modified == True ) { int d; if( *fileName == EOS ) d = edSaveUntitled; else d = edSaveModify; switch( editorDialog( d, fileName ) ) { case cmYes: return save(); case cmNo: modified = False; return True; case cmCancel: return False; } } } return True; }
void TEditor::find() { TFindDialogRec findRec( findStr, editorFlags ); if( editorDialog( edFind, &findRec ) != cmCancel ) { strcpy( findStr, findRec.find ); editorFlags = findRec.options & ~efDoReplace; doSearchReplace(); } }
Boolean TFileEditor::loadFile() { ifstream f( fileName, ios::in | ios::binary ); if( !f ) { setBufLen( 0 ); return True; } else { streampos crtpos = f.tellg(); f.seekg(0, ios_base::end); long fSize = f.tellg(); f.seekg(crtpos); if ( setBufSize(ulong(fSize)) == false ) { editorDialog( edOutOfMemory ); return False; } else { if ( fSize > INT_MAX ) { f.read( &buffer[bufSize - ulong(fSize)], INT_MAX ); f.read( &buffer[bufSize - ulong(fSize) + INT_MAX], ulong(fSize - INT_MAX) ); } else f.read( &buffer[bufSize - ulong(fSize)], ulong(fSize) ); if( !f ) { editorDialog( edReadError, fileName ); return False; } else { setBufLen(ulong(fSize)); return True; } } } }
Boolean TFileEditor::saveFile() { char drive[MAXDRIVE]; char dir[MAXDIR]; char file[MAXFILE]; char ext[MAXEXT]; if( (editorFlags & efBackupFiles) != 0 ) { fnsplit( fileName, drive, dir, file, ext ); char backupName[MAXPATH]; fnmerge( backupName, drive, dir, file, backupExt ); unlink( backupName ); rename( fileName, backupName ); } ofstream f( fileName, ios::out | ios::binary ); if( !f ) { editorDialog( edCreateError, fileName ); return False; } else { writeBlock( f, buffer, curPtr ); writeBlock( f, buffer+curPtr+gapLen, bufLen-curPtr ); if( !f ) { editorDialog( edWriteError, fileName ); return False; } else { modified = False; update(ufUpdate); } } return True; }
void TEditor::replace() { TReplaceDialogRec replaceRec( findStr, replaceStr, editorFlags ); if( editorDialog( edReplace, &replaceRec ) != cmCancel ) { strcpy( findStr, replaceRec.find ); strcpy( replaceStr, replaceRec.replace ); editorFlags = replaceRec.options | efDoReplace; doSearchReplace(); } }
Boolean TFileEditor::loadFile() { ifstream f( fileName, ios::in | ios::binary ); if( !f ) { setBufLen( 0 ); return True; } else { long fSize = filelength( f.rdbuf()->fd() ); if( fSize > (UINT_MAX-0x1F) || setBufSize(ushort(fSize)) == False ) { editorDialog( edOutOfMemory ); return False; } else { if ( fSize > INT_MAX ) { f.read( &buffer[bufSize - size_t(fSize)], INT_MAX ); f.read( &buffer[bufSize - size_t(fSize) + INT_MAX], size_t(fSize - INT_MAX) ); } else f.read( &buffer[bufSize - size_t(fSize)], size_t(fSize) ); if( !f ) { editorDialog( edReadError, fileName ); return False; } else { setBufLen(size_t(fSize)); return True; } } } }
Boolean TFileEditor::saveAs() { Boolean res = False; if( editorDialog( edSaveAs, fileName ) != cmCancel ) { fexpand( fileName ); message( owner, evBroadcast, cmUpdateTitle, 0 ); res = saveFile(); if( isClipboard() == True ) *fileName = EOS; } return res; }
Boolean TEditor::insertBuffer( char *p, ushort offset, ushort length, Boolean allowUndo, Boolean selectText ) { selecting = False; ushort selLen = selEnd - selStart; if( selLen == 0 && length == 0 ) return True; ushort delLen = 0; if( allowUndo == True ) if( curPtr == selStart ) delLen = selLen; else if( selLen > insCount ) delLen = selLen - insCount; long newSize = long(bufLen + delCount - selLen + delLen) + length; if( newSize > bufLen + delCount ) if( newSize > 0xFFE0l || setBufSize(ushort(newSize)) == False ) { editorDialog( edOutOfMemory ); return False; } ushort selLines = countLines( &buffer[bufPtr(selStart)], selLen ); if( curPtr == selEnd ) { if( allowUndo == True ) { if( delLen > 0 ) memmove( &buffer[curPtr + gapLen - delCount - delLen], &buffer[selStart], delLen ); insCount -= selLen - delLen; } curPtr = selStart; curPos.y -= selLines; } if( delta.y > curPos.y ) { delta.y -= selLines; if( delta.y < curPos.y ) delta.y = curPos.y; } if( length > 0 ) memmove( &buffer[curPtr], &p[offset], length ); ushort lines = countLines( &buffer[curPtr], length ); curPtr += length; curPos.y += lines; drawLine = curPos.y; drawPtr = lineStart(curPtr); curPos.x = charPos(drawPtr, curPtr); if( selectText == False ) selStart = curPtr; selEnd = curPtr; bufLen += length - selLen; gapLen -= length - selLen; if( allowUndo == True ) { delCount += delLen; insCount += length; } limit.y += lines - selLines; delta.y = max(0, min(delta.y, limit.y - size.y)); if( isClipboard() == False ) modified = True; setBufSize(bufLen + delCount); if( selLines == 0 && lines == 0 ) update(ufLine); else update(ufView); return True; }