summaryrefslogtreecommitdiff
path: root/src/Fl_Text_Buffer.cxx
diff options
context:
space:
mode:
authorMichael R Sweet <michael.r.sweet@gmail.com>2002-09-20 19:59:45 +0000
committerMichael R Sweet <michael.r.sweet@gmail.com>2002-09-20 19:59:45 +0000
commite04a3734e7280d2557a072b02dd1d2441cbfc744 (patch)
treeef261a912e03a9c06a88bc7d47e37980677c9456 /src/Fl_Text_Buffer.cxx
parentf9f28ad12a1ca65c59bccd78d93df4e48ef8566b (diff)
Apply patch from George Garvey to make Fl_Text_Display/Buffer based on
NEdit 5.3... git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@2631 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Text_Buffer.cxx')
-rw-r--r--src/Fl_Text_Buffer.cxx112
1 files changed, 110 insertions, 2 deletions
diff --git a/src/Fl_Text_Buffer.cxx b/src/Fl_Text_Buffer.cxx
index 9dadec060..50cf59723 100644
--- a/src/Fl_Text_Buffer.cxx
+++ b/src/Fl_Text_Buffer.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Text_Buffer.cxx,v 1.9.2.11 2002/08/09 03:17:30 easysw Exp $"
+// "$Id: Fl_Text_Buffer.cxx,v 1.9.2.12 2002/09/20 19:59:45 easysw Exp $"
//
// Copyright 2001-2002 by Bill Spitzak and others.
// Original code Copyright Mark Edel. Permission to distribute under
@@ -93,6 +93,9 @@ Fl_Text_Buffer::Fl_Text_Buffer( int requestedSize ) {
mNodifyProcs = NULL;
mCbArgs = NULL;
mNModifyProcs = 0;
+ mNPredeleteProcs = 0;
+ mPredeleteProcs = NULL;
+ mPredeleteCbArgs = NULL;
mCursorPosHint = 0;
mNullSubsChar = '\0';
#ifdef PURIFY
@@ -109,6 +112,10 @@ Fl_Text_Buffer::~Fl_Text_Buffer() {
free( ( void * ) mNodifyProcs );
free( ( void * ) mCbArgs );
}
+ if ( mNPredeleteProcs != 0 ) {
+ free( ( void * ) mPredeleteProcs );
+ free( ( void * ) mPredeleteCbArgs );
+ }
}
/*
@@ -133,6 +140,8 @@ void Fl_Text_Buffer::text( const char *t ) {
int insertedLength, deletedLength;
const char *deletedText;
+ call_predelete_callbacks(0, length());
+
/* Save information for redisplay, and get rid of the old buffer */
deletedText = text();
deletedLength = mLength;
@@ -220,6 +229,9 @@ void Fl_Text_Buffer::insert( int pos, const char *s ) {
if ( pos > mLength ) pos = mLength;
if ( pos < 0 ) pos = 0;
+ /* Even if nothing is deleted, we must call these callbacks */
+ call_predelete_callbacks( pos, 0 );
+
/* insert and redisplay */
nInserted = insert_( pos, s );
mCursorPosHint = pos + nInserted;
@@ -234,6 +246,7 @@ void Fl_Text_Buffer::replace( int start, int end, const char *s ) {
const char * deletedText;
int nInserted;
+ call_predelete_callbacks( start, end-start );
deletedText = text_range( start, end );
remove_( start, end );
nInserted = insert_( start, s );
@@ -256,6 +269,7 @@ void Fl_Text_Buffer::remove( int start, int end ) {
if ( end > mLength ) end = mLength;
if ( end < 0 ) end = 0;
+ call_predelete_callbacks( start, end-start );
/* Remove and redisplay */
deletedText = text_range( start, end );
remove_( start, end );
@@ -314,6 +328,7 @@ void Fl_Text_Buffer::insert_column( int column, int startPos, const char *s,
lineStartPos = line_start( startPos );
nDeleted = line_end( skip_lines( startPos, nLines ) ) -
lineStartPos;
+ call_predelete_callbacks( lineStartPos, nDeleted );
deletedText = text_range( lineStartPos, lineStartPos + nDeleted );
insert_column_( column, lineStartPos, s, &insertDeleted, &nInserted,
&mCursorPosHint );
@@ -342,6 +357,7 @@ void Fl_Text_Buffer::overlay_rectangular( int startPos, int rectStart,
lineStartPos = line_start( startPos );
nDeleted = line_end( skip_lines( startPos, nLines ) ) -
lineStartPos;
+ call_predelete_callbacks( lineStartPos, nDeleted );
deletedText = text_range( lineStartPos, lineStartPos + nDeleted );
overlay_rectangular_( lineStartPos, rectStart, rectEnd, s, &insertDeleted,
&nInserted, &mCursorPosHint );
@@ -374,6 +390,8 @@ void Fl_Text_Buffer::replace_rectangular( int start, int end, int rectStart,
start = line_start( start );
end = line_end( end );
+ call_predelete_callbacks( start, end-start );
+
/* If more lines will be deleted than inserted, pad the inserted text
with newlines to make it as long as the number of deleted lines. This
will indent all of the text to the right of the rectangle to the same
@@ -424,6 +442,7 @@ void Fl_Text_Buffer::remove_rectangular( int start, int end, int rectStart,
start = line_start( start );
end = line_end( end );
+ call_predelete_callbacks( start, end-start );
deletedText = text_range( start, end );
remove_rectangular_( start, end, rectStart, rectEnd, &nInserted,
&mCursorPosHint );
@@ -492,6 +511,10 @@ char * Fl_Text_Buffer::text_in_rectangle( int start, int end,
void Fl_Text_Buffer::tab_distance( int tabDist ) {
const char * deletedText;
+ /* First call the pre-delete callbacks with the previous tab setting
+ still active. */
+ call_predelete_callbacks( 0, mLength );
+
/* Change the tab setting */
mTabDist = tabDist;
@@ -693,6 +716,80 @@ void Fl_Text_Buffer::remove_modify_callback( Fl_Text_Modify_Cb bufModifiedCB,
}
/*
+** Add a callback routine to be called before text is deleted from the buffer.
+*/
+void Fl_Text_Buffer::add_predelete_callback(Fl_Text_Predelete_Cb bufPreDeleteCB,
+ void *cbArg) {
+ Fl_Text_Predelete_Cb *newPreDeleteProcs;
+ void **newCBArgs;
+ int i;
+
+ newPreDeleteProcs = new Fl_Text_Predelete_Cb[ mNPredeleteProcs + 1 ];
+ newCBArgs = new void * [ mNPredeleteProcs + 1 ];
+ for ( i = 0; i < mNPredeleteProcs; i++ ) {
+ newPreDeleteProcs[i + 1] = mPredeleteProcs[i];
+ newCBArgs[i + 1] = mPredeleteCbArgs[i];
+ }
+ if (! mNPredeleteProcs != 0) {
+ delete [] mPredeleteProcs;
+ delete [] mPredeleteCbArgs;
+ }
+ newPreDeleteProcs[0] = bufPreDeleteCB;
+ newCBArgs[0] = cbArg;
+ mNPredeleteProcs++;
+ mPredeleteProcs = newPreDeleteProcs;
+ mPredeleteCbArgs = newCBArgs;
+}
+
+void Fl_Text_Buffer::remove_predelete_callback(
+ Fl_Text_Predelete_Cb bufPreDeleteCB, void *cbArg) {
+ int i, toRemove = -1;
+ Fl_Text_Predelete_Cb *newPreDeleteProcs;
+ void **newCBArgs;
+
+ /* find the matching callback to remove */
+ for ( i = 0; i < mNPredeleteProcs; i++) {
+ if (mPredeleteProcs[i] == bufPreDeleteCB &&
+ mPredeleteCbArgs[i] == cbArg) {
+ toRemove = i;
+ break;
+ }
+ }
+ if (toRemove == -1) {
+ fprintf(stderr, "Internal Error: Can't find pre-delete CB to remove\n");
+ return;
+ }
+
+ /* Allocate new lists for remaining callback procs and args (if
+ any are left) */
+ mNPredeleteProcs--;
+ if (mNPredeleteProcs == 0) {
+ mNPredeleteProcs = 0;
+ delete[] mPredeleteProcs;
+ mPredeleteProcs = NULL;
+ delete[] mPredeleteCbArgs;
+ mPredeleteCbArgs = NULL;
+ return;
+ }
+ newPreDeleteProcs = new Fl_Text_Predelete_Cb [ mNPredeleteProcs ];
+ newCBArgs = new void * [ mNPredeleteProcs ];
+
+ /* copy out the remaining members and free the old lists */
+ for ( i = 0; i < toRemove; i++) {
+ newPreDeleteProcs[i] = mPredeleteProcs[i];
+ newCBArgs[i] = mPredeleteCbArgs[i];
+ }
+ for ( ; i < mNPredeleteProcs; i++) {
+ newPreDeleteProcs[i] = mPredeleteProcs[i+1];
+ newCBArgs[i] = mPredeleteCbArgs[i+1];
+ }
+ delete[] mPredeleteProcs;
+ delete[] mPredeleteCbArgs;
+ mPredeleteProcs = newPreDeleteProcs;
+ mPredeleteCbArgs = newCBArgs;
+}
+
+/*
** Return the text from the entire line containing position "pos"
*/
char * Fl_Text_Buffer::line_text( int pos ) {
@@ -1811,6 +1908,17 @@ void Fl_Text_Buffer::call_modify_callbacks( int pos, int nDeleted,
}
/*
+** Call the stored pre-delete callback procedure(s) for this buffer to update
+** the changed area(s) on the screen and any other listeners.
+*/
+void Fl_Text_Buffer::call_predelete_callbacks(int pos, int nDeleted) {
+ int i;
+
+ for (i=0; i<mNPredeleteProcs; i++)
+ (*mPredeleteProcs[i])(pos, nDeleted, mPredeleteCbArgs[i]);
+}
+
+/*
** Call the stored redisplay procedure(s) for this buffer to update the
** screen for a change in a selection.
*/
@@ -2289,5 +2397,5 @@ Fl_Text_Buffer::outputfile(const char *file, int start, int end, int buflen) {
//
-// End of "$Id: Fl_Text_Buffer.cxx,v 1.9.2.11 2002/08/09 03:17:30 easysw Exp $".
+// End of "$Id: Fl_Text_Buffer.cxx,v 1.9.2.12 2002/09/20 19:59:45 easysw Exp $".
//