00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef FL_TEXT_DISPLAY_H
00025 #define FL_TEXT_DISPLAY_H
00026
00027 #include "fl_draw.H"
00028 #include "Fl_Group.H"
00029 #include "Fl_Widget.H"
00030 #include "Fl_Scrollbar.H"
00031 #include "Fl_Text_Buffer.H"
00032
00082 class FL_EXPORT Fl_Text_Display: public Fl_Group {
00083
00084 public:
00085
00089 enum {
00090 NORMAL_CURSOR,
00091 CARET_CURSOR,
00092 DIM_CURSOR,
00093 BLOCK_CURSOR,
00094 HEAVY_CURSOR,
00095 SIMPLE_CURSOR
00096 };
00097
00103 enum {
00104 CURSOR_POS,
00105 CHARACTER_POS
00106 };
00107
00113 enum {
00114 DRAG_NONE = -2,
00115 DRAG_START_DND = -1,
00116 DRAG_CHAR = 0,
00117 DRAG_WORD = 1,
00118 DRAG_LINE = 2
00119 };
00120
00124 enum {
00125 WRAP_NONE,
00126 WRAP_AT_COLUMN,
00127 WRAP_AT_PIXEL,
00128 WRAP_AT_BOUNDS
00129 };
00130
00131 friend void fl_text_drag_me(int pos, Fl_Text_Display* d);
00132
00133 typedef void (*Unfinished_Style_Cb)(int, void *);
00134
00148 struct Style_Table_Entry {
00149 Fl_Color color;
00150 Fl_Font font;
00151 Fl_Fontsize size;
00152 unsigned attr;
00153 };
00154
00155 Fl_Text_Display(int X, int Y, int W, int H, const char *l = 0);
00156 ~Fl_Text_Display();
00157
00158 virtual int handle(int e);
00159
00160 void buffer(Fl_Text_Buffer* buf);
00161
00167 void buffer(Fl_Text_Buffer& buf) { buffer(&buf); }
00168
00174 Fl_Text_Buffer* buffer() const { return mBuffer; }
00175
00176 void redisplay_range(int start, int end);
00177 void scroll(int topLineNum, int horizOffset);
00178 void insert(const char* text);
00179 void overstrike(const char* text);
00180 void insert_position(int newPos);
00181
00186 int insert_position() const { return mCursorPos; }
00187 int position_to_xy(int pos, int* x, int* y) const;
00188
00189 int in_selection(int x, int y) const;
00190 void show_insert_position();
00191
00192 int move_right();
00193 int move_left();
00194 int move_up();
00195 int move_down();
00196 int count_lines(int start, int end, bool start_pos_is_line_start) const;
00197 int line_start(int pos) const;
00198 int line_end(int startPos, bool startPosIsLineStart) const;
00199 int skip_lines(int startPos, int nLines, bool startPosIsLineStart);
00200 int rewind_lines(int startPos, int nLines);
00201 void next_word(void);
00202 void previous_word(void);
00203
00204 void show_cursor(int b = 1);
00205
00209 void hide_cursor() { show_cursor(0); }
00210
00211 void cursor_style(int style);
00212
00217 Fl_Color cursor_color() const {return mCursor_color;}
00218
00223 void cursor_color(Fl_Color n) {mCursor_color = n;}
00224
00229 int scrollbar_width() const { return scrollbar_width_; }
00230
00235 void scrollbar_width(int W) { scrollbar_width_ = W; }
00236
00241 Fl_Align scrollbar_align() const { return scrollbar_align_; }
00242
00247 void scrollbar_align(Fl_Align a) { scrollbar_align_ = a; }
00248
00254 int word_start(int pos) const { return buffer()->word_start(pos); }
00255
00261 int word_end(int pos) const { return buffer()->word_end(pos); }
00262
00263
00264 void highlight_data(Fl_Text_Buffer *styleBuffer,
00265 const Style_Table_Entry *styleTable,
00266 int nStyles, char unfinishedStyle,
00267 Unfinished_Style_Cb unfinishedHighlightCB,
00268 void *cbArg);
00269
00270 int position_style(int lineStartPos, int lineLen, int lineIndex) const;
00271
00277 int shortcut() const {return shortcut_;}
00278
00284 void shortcut(int s) {shortcut_ = s;}
00285
00290 Fl_Font textfont() const {return textfont_;}
00291
00296 void textfont(Fl_Font s) {textfont_ = s; mColumnScale = 0;}
00297
00302 Fl_Fontsize textsize() const {return textsize_;}
00303
00308 void textsize(Fl_Fontsize s) {textsize_ = s; mColumnScale = 0;}
00309
00314 Fl_Color textcolor() const {return textcolor_;}
00315
00320 void textcolor(Fl_Color n) {textcolor_ = n;}
00321
00322 int wrapped_column(int row, int column) const;
00323 int wrapped_row(int row) const;
00324 void wrap_mode(int wrap, int wrap_margin);
00325
00326 virtual void resize(int X, int Y, int W, int H);
00327
00333 double x_to_col(double x) const;
00334
00341 double col_to_x(double col) const;
00342
00343 void linenumber_width(int width);
00344 int linenumber_width() const;
00345 void linenumber_font(Fl_Font val);
00346 Fl_Font linenumber_font() const;
00347 void linenumber_size(Fl_Fontsize val);
00348 Fl_Fontsize linenumber_size() const;
00349 void linenumber_fgcolor(Fl_Color val);
00350 Fl_Color linenumber_fgcolor() const;
00351 void linenumber_bgcolor(Fl_Color val);
00352 Fl_Color linenumber_bgcolor() const;
00353 void linenumber_align(Fl_Align val);
00354 Fl_Align linenumber_align() const;
00355 void linenumber_format(const char* val);
00356 const char* linenumber_format() const;
00357
00358 protected:
00359
00360
00361
00362
00363
00364 virtual void draw();
00365 void draw_text(int X, int Y, int W, int H);
00366 void draw_range(int start, int end);
00367 void draw_cursor(int, int);
00368
00369 void draw_string(int style, int x, int y, int toX, const char *string,
00370 int nChars) const;
00371
00372 void draw_vline(int visLineNum, int leftClip, int rightClip,
00373 int leftCharIndex, int rightCharIndex);
00374
00375 int find_x(const char *s, int len, int style, int x) const;
00376
00377 enum {
00378 DRAW_LINE,
00379 FIND_INDEX,
00380 FIND_INDEX_FROM_ZERO,
00381 GET_WIDTH
00382 };
00383
00384 int handle_vline(int mode,
00385 int lineStart, int lineLen, int leftChar, int rightChar,
00386 int topClip, int bottomClip,
00387 int leftClip, int rightClip) const;
00388
00389 void draw_line_numbers(bool clearAll);
00390
00391 void clear_rect(int style, int x, int y, int width, int height) const;
00392 void display_insert();
00393
00394 void offset_line_starts(int newTopLineNum);
00395
00396 void calc_line_starts(int startLine, int endLine);
00397
00398 void update_line_starts(int pos, int charsInserted, int charsDeleted,
00399 int linesInserted, int linesDeleted, int *scrolled);
00400
00401 void calc_last_char();
00402
00403 int position_to_line( int pos, int* lineNum ) const;
00404 double string_width(const char* string, int length, int style) const;
00405
00406 static void scroll_timer_cb(void*);
00407
00408 static void buffer_predelete_cb(int pos, int nDeleted, void* cbArg);
00409 static void buffer_modified_cb(int pos, int nInserted, int nDeleted,
00410 int nRestyled, const char* deletedText,
00411 void* cbArg);
00412
00413 static void h_scrollbar_cb(Fl_Scrollbar* w, Fl_Text_Display* d);
00414 static void v_scrollbar_cb( Fl_Scrollbar* w, Fl_Text_Display* d);
00415 void update_v_scrollbar();
00416 void update_h_scrollbar();
00417 int measure_vline(int visLineNum) const;
00418 int longest_vline() const;
00419 int empty_vlines() const;
00420 int vline_length(int visLineNum) const;
00421 int xy_to_position(int x, int y, int PosType = CHARACTER_POS) const;
00422
00423 void xy_to_rowcol(int x, int y, int* row, int* column,
00424 int PosType = CHARACTER_POS) const;
00425 void maintain_absolute_top_line_number(int state);
00426 int get_absolute_top_line_number() const;
00427 void absolute_top_line_number(int oldFirstChar);
00428 int maintaining_absolute_top_line_number() const;
00429 void reset_absolute_top_line_number();
00430 int position_to_linecol(int pos, int* lineNum, int* column) const;
00431 int scroll_(int topLineNum, int horizOffset);
00432
00433 void extend_range_for_styles(int* start, int* end);
00434
00435 void find_wrap_range(const char *deletedText, int pos, int nInserted,
00436 int nDeleted, int *modRangeStart, int *modRangeEnd,
00437 int *linesInserted, int *linesDeleted);
00438 void measure_deleted_lines(int pos, int nDeleted);
00439 void wrapped_line_counter(Fl_Text_Buffer *buf, int startPos, int maxPos,
00440 int maxLines, bool startPosIsLineStart,
00441 int styleBufOffset, int *retPos, int *retLines,
00442 int *retLineStart, int *retLineEnd,
00443 bool countLastLineMissingNewLine = true) const;
00444 void find_line_end(int pos, bool start_pos_is_line_start, int *lineEnd,
00445 int *nextLineStart) const;
00446 double measure_proportional_character(const char *s, int colNum, int pos) const;
00447 int wrap_uses_character(int lineEndPos) const;
00448
00449 int damage_range1_start, damage_range1_end;
00450 int damage_range2_start, damage_range2_end;
00451 int mCursorPos;
00452 int mCursorOn;
00453 int mCursorOldY;
00454 int mCursorToHint;
00455
00456
00457 int mCursorStyle;
00458 int mCursorPreferredXPos;
00459 int mNVisibleLines;
00460 int mNBufferLines;
00461 Fl_Text_Buffer* mBuffer;
00462 Fl_Text_Buffer* mStyleBuffer;
00463
00464 int mFirstChar, mLastChar;
00465
00466
00467
00468 int mContinuousWrap;
00469 int mWrapMarginPix;
00470
00471 int* mLineStarts;
00472 int mTopLineNum;
00473
00474 int mAbsTopLineNum;
00475
00476
00477
00478 int mNeedAbsTopLineNum;
00479
00480
00481 int mHorizOffset;
00482 int mTopLineNumHint;
00483
00484 int mHorizOffsetHint;
00485 int mNStyles;
00486 const Style_Table_Entry *mStyleTable;
00487
00488 char mUnfinishedStyle;
00489
00490 Unfinished_Style_Cb mUnfinishedHighlightCB;
00491
00492 void* mHighlightCBArg;
00493
00494 int mMaxsize;
00495
00496 int mSuppressResync;
00497
00498 int mNLinesDeleted;
00499
00500
00501 int mModifyingTabDistance;
00502
00503
00504 mutable double mColumnScale;
00505
00506
00507
00508
00509 Fl_Color mCursor_color;
00510
00511 Fl_Scrollbar* mHScrollBar;
00512 Fl_Scrollbar* mVScrollBar;
00513 int scrollbar_width_;
00514 Fl_Align scrollbar_align_;
00515 int dragPos, dragType, dragging;
00516 int display_insert_position_hint;
00517 struct { int x, y, w, h; } text_area;
00518
00519 int shortcut_;
00520
00521 Fl_Font textfont_;
00522 Fl_Fontsize textsize_;
00523 Fl_Color textcolor_;
00524
00525
00526 int mLineNumLeft, mLineNumWidth;
00527
00528
00529 #if FLTK_ABI_VERSION >= 10303
00530 Fl_Font linenumber_font_;
00531 Fl_Fontsize linenumber_size_;
00532 Fl_Color linenumber_fgcolor_;
00533 Fl_Color linenumber_bgcolor_;
00534 Fl_Align linenumber_align_;
00535 const char* linenumber_format_;
00536 #endif
00537 };
00538
00539 #endif
00540
00541
00542
00543