summaryrefslogtreecommitdiffstats
path: root/fltk/fltk/TextBuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'fltk/fltk/TextBuffer.h')
-rw-r--r--fltk/fltk/TextBuffer.h285
1 files changed, 285 insertions, 0 deletions
diff --git a/fltk/fltk/TextBuffer.h b/fltk/fltk/TextBuffer.h
new file mode 100644
index 0000000..3a1b386
--- /dev/null
+++ b/fltk/fltk/TextBuffer.h
@@ -0,0 +1,285 @@
+//
+// "$Id: TextBuffer.h 5432 2006-09-16 02:03:04Z spitzak $"
+//
+// Header file for TextBuffer class.
+//
+// Copyright 2001-2006 by Bill Spitzak and others.
+// Original code Copyright Mark Edel. Permission to distribute under
+// the LGPL for the FLTK library granted by Mark Edel.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library 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
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+#ifndef _fltk_TextBuffer_h_
+#define _fltk_TextBuffer_h_
+
+#include "FL_API.h"
+
+namespace fltk {
+
+/* Maximum length in characters of a tab or control character expansion
+ of a single buffer character */
+#define TEXT_MAX_EXP_CHAR_LEN 20
+
+class FL_API TextSelection {
+public:
+ TextSelection();
+
+ void set(int start, int end);
+ void set_rectangular(int start, int end, int rectstart, int rectend);
+ void update(int pos, int ndeleted, int ninserted);
+ bool rectangular() const { return rectangular_; }
+ int start() const { return start_; }
+ int end() const { return end_; }
+ int rectstart() const { return rectstart_; }
+ int rectend() const { return rectend_; }
+ bool selected() const { return selected_; }
+ void selected(bool b) { selected_ = b; }
+ bool zerowidth() const { return zerowidth_; }
+ void zerowidth(bool b) { zerowidth_ = b; }
+ bool includes(int pos, int lineStartPos, int dispIndex);
+ int position(int* start, int* end);
+ int position(int* start, int* end, int* isrect, int* rectstart, int* rectend);
+
+protected:
+ bool selected_; /*!< True if the selection is active */
+ bool rectangular_; /*!< True if the selection is rectangular */
+ bool zerowidth_; /*!< Width 0 selections aren't "real" selections, but
+ they can be useful when creating rectangular
+ selections from the keyboard. */
+ int start_; /*!< Pos. of start of selection, or if rectangular
+ start of line containing it. */
+ int end_; /*!< Pos. of end of selection, or if rectangular
+ end of line containing it. */
+ int rectstart_; /*!< Indent of left edge of rect. selection */
+ int rectend_; /*!< Indent of right edge of rect. selection */
+};
+
+
+typedef void (*Text_Modify_Cb)( int pos, int nInserted, int nDeleted,
+ int nRestyled, const char* deletedText,
+ void* cbArg);
+
+typedef void (*Text_Predelete_Cb)(int pos, int nDeleted, void* cbArg);
+
+/** TextBuffer */
+class FL_API TextBuffer {
+public:
+ TextBuffer(int requestedsize = 0);
+ ~TextBuffer();
+
+ int length() const { return length_; }
+
+ const char *text();
+ void text(const char* text);
+
+ char character(int pos);
+ char *text_range(int start, int end);
+ char *text_in_rectangle(int start, int end, int rectStart, int rectEnd);
+
+ void insert(int pos, const char *text);
+ void append(const char *t) { insert(length(), t); }
+ void remove(int start, int end);
+ void replace(int start, int end, const char *text);
+ void copy(TextBuffer *from_buf, int from_start, int from_end, int to_pos);
+
+ int undo(int *cp = 0);
+ void canUndo(char flag = 1);
+
+ int insertfile(const char *file, int pos, int buflen = 128*1024);
+ int appendfile(const char *file, int buflen = 128*1024)
+ { return insertfile(file, length(), buflen); }
+ int loadfile(const char *file, int buflen = 128*1024)
+ { select(0, length()); remove_selection(); return appendfile(file, buflen); }
+ int outputfile(const char *file, int start, int end, int buflen = 128*1024);
+ int savefile(const char *file, int buflen = 128*1024)
+ { return outputfile(file, 0, length(), buflen); }
+
+ void insert_column(int column, int startpos, const char *text,
+ int *chars_inserted, int *chars_deleted);
+
+ void replace_rectangular(int start, int end, int rectstart, int rectend,
+ const char *text);
+
+ void overlay_rectangular(int startpos, int rectStart, int rectEnd,
+ const char* text, int* charsInserted,
+ int* charsDeleted);
+
+ void remove_rectangular(int start, int end, int rectStart, int rectEnd);
+ void clear_rectangular(int start, int end, int rectStart, int rectEnd);
+ int tab_distance() const { return tabdist_; }
+ void tab_distance(int tabDist);
+
+ void select(int start, int end);
+ bool selected() const { return primary_.selected(); }
+ void unselect();
+
+ void select_rectangular(int start, int end, int rectStart, int rectEnd);
+ int selection_position(int* start, int* end);
+
+ int selection_position(int* start, int* end, int* isRect, int* rectStart,
+ int* rectEnd);
+
+ char *selection_text();
+ void remove_selection();
+ void replace_selection(const char* text);
+ void secondary_select(int start, int end);
+ void secondary_unselect();
+
+ void secondary_select_rectangular(int start, int end, int rectStart,
+ int rectEnd);
+
+ int secondary_selection_position(int* start, int* end, int* isRect,
+ int* rectStart, int* rectEnd);
+
+ char *secondary_selection_text();
+ void remove_secondary_selection();
+ void replace_secondary_selection(const char* text);
+ void highlight(int start, int end);
+ void unhighlight();
+ void highlight_rectangular(int start, int end, int rectStart, int rectEnd);
+
+ int highlight_position(int* start, int* end, int* isRect, int* rectStart,
+ int* rectEnd);
+
+ char *highlight_text();
+ void add_modify_callback(Text_Modify_Cb bufModifiedCB, void* cbArg);
+ void remove_modify_callback(Text_Modify_Cb bufModifiedCB, void* cbArg);
+
+ void call_modify_callbacks() { call_modify_callbacks(0, 0, 0, 0, 0); }
+
+ void add_predelete_callback(Text_Predelete_Cb bufPredelCB, void* cbArg);
+ void remove_predelete_callback(Text_Predelete_Cb predelCB, void* cbArg);
+
+ void call_predelete_callbacks() { call_predelete_callbacks(0, 0); }
+
+ char* line_text(int pos);
+ int line_start(int pos);
+ int line_end(int pos);
+ int word_start(int pos);
+ int word_end(int pos);
+ int expand_character(int pos, int indent, char *outStr);
+
+ static int expand_character(char c, int indent, char* outStr, int tabDist,
+ char nullSubsChar);
+
+ static int character_width(char c, int indent, int tabDist, char nullSubsChar);
+ int count_displayed_characters(int lineStartPos, int targetPos);
+ int count_displayed_characters_utf(int lineStartPos, int targetPos);
+ int skip_displayed_characters(int lineStartPos, int nChars);
+ int skip_displayed_characters_utf(int lineStartPos, int nChars);
+ int count_lines(int startPos, int endPos);
+ int skip_lines(int startPos, int nLines);
+ int rewind_lines(int startPos, int nLines);
+
+ bool findchar_forward(int startPos, char searchChar, int* foundPos);
+ bool findchar_backward(int startPos, char searchChar, int* foundPos);
+
+ bool findchars_forward(int startpos, const char *searchChars, int *foundPos);
+ bool findchars_backward(int startpos, const char *searchChars, int *foundPos);
+
+ bool search_forward(int startPos, const char* searchString, int* foundPos,
+ bool matchCase = false);
+
+ bool search_backward(int startPos, const char* searchString, int* foundPos,
+ bool matchCase = false);
+
+ char null_substitution_character() { return nullsubschar_; }
+ TextSelection* primary_selection() { return &primary_; }
+ TextSelection* secondary_selection() { return &secondary_; }
+ TextSelection* highlight_selection() { return &highlight_; }
+
+protected:
+ void call_modify_callbacks(int pos, int nDeleted, int nInserted,
+ int nRestyled, const char* deletedText);
+ void call_predelete_callbacks(int pos, int nDeleted);
+
+ int insert_(int pos, const char* text);
+ void remove_(int start, int end);
+
+ void remove_rectangular_(int start, int end, int rectStart, int rectEnd,
+ int* replaceLen, int* endPos);
+
+ void insert_column_(int column, int startPos, const char* insText,
+ int* nDeleted, int* nInserted, int* endPos);
+
+ void overlay_rectangular_(int startPos, int rectStart, int rectEnd,
+ const char* insText, int* nDeleted,
+ int* nInserted, int* endPos);
+
+ void redisplay_selection(TextSelection* oldSelection,
+ TextSelection* newSelection);
+
+ void move_gap(int pos);
+ void reallocate_with_gap(int newGapStart, int newGapLen);
+ char *selection_text_(TextSelection *sel);
+ void remove_selection_(TextSelection *sel);
+ void replace_selection_(TextSelection *sel, const char* text);
+
+ void rectangular_selection_boundaries(int lineStartPos, int rectStart,
+ int rectEnd, int* selStart,
+ int* selEnd);
+
+ void update_selections(int pos, int nDeleted, int nInserted);
+
+ TextSelection primary_; /* highlighted areas */
+ TextSelection secondary_;
+ TextSelection highlight_;
+
+ int length_; /*!< length of the text in the buffer (the length
+ of the buffer itself must be calculated:
+ gapend - gapstart + length) */
+ char *buf_; /*!< allocated memory where the text is stored */
+ int gapstart_; /*!< points to the first character of the gap */
+ int gapend_; /*!< points to the first char after the gap */
+
+ int tabdist_; /*!< equiv. number of characters in a tab */
+ bool usetabs_; /*!< True if buffer routines are allowed to use
+ tabs for padding in rectangular operations */
+
+ int nmodifyprocs_; /*!< number of modify-redisplay procs attached */
+ Text_Modify_Cb *modifyprocs_; /* modified to redisplay contents */
+ void **modifycbargs_; /*!< caller arguments for modifyprocs_ above */
+
+ int npredeleteprocs_; /*!< number of pre-delete procs attached */
+ Text_Predelete_Cb *predeleteprocs_; /* procedure to call before text is deleted */
+ /* from the buffer; at most one is supported. */
+ void **prepeletecbargs_; /*!< caller argument for pre-delete proc above */
+
+ int cursorposhint_; /*!< hint for reasonable cursor position after
+ a buffer modification operation */
+ char nullsubschar_; /*!< TextBuffer is based on C null-terminated strings,
+ so ascii-nul characters must be substituted
+ with something else. This is the else, but
+ of course, things get quite messy when you
+ use it */
+
+ char mCanUndo; /*!< if this buffer is used for attributes, it must
+ not do any undo calls */
+};
+
+} /* namespace fltk */
+
+#endif
+
+//
+// End of "$Id: TextBuffer.h 5432 2006-09-16 02:03:04Z spitzak $".
+//
+