00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef FL_TEXT_DISPLAY_H
00034 #define FL_TEXT_DISPLAY_H
00035
00036 #include "fl_draw.H"
00037 #include "Fl_Group.H"
00038 #include "Fl_Widget.H"
00039 #include "Fl_Scrollbar.H"
00040 #include "Fl_Text_Buffer.H"
00041
00050 class FL_EXPORT Fl_Text_Display: public Fl_Group
00051 {
00052 public:
00053
00057 enum {
00058 NORMAL_CURSOR,
00059 CARET_CURSOR,
00060 DIM_CURSOR,
00061 BLOCK_CURSOR,
00062 HEAVY_CURSOR
00063 };
00064
00070 enum {
00071 CURSOR_POS,
00072 CHARACTER_POS
00073 };
00074
00080 enum {
00081 DRAG_NONE = -2,
00082 DRAG_START_DND = -1,
00083 DRAG_CHAR = 0,
00084 DRAG_WORD = 1,
00085 DRAG_LINE = 2
00086 };
00087
00091 enum {
00092 WRAP_NONE,
00093 WRAP_AT_COLUMN,
00094 WRAP_AT_PIXEL,
00095 WRAP_AT_BOUNDS
00096 };
00097
00098 friend void fl_text_drag_me(int pos, Fl_Text_Display* d);
00099
00100 typedef void (*Unfinished_Style_Cb)(int, void *);
00101
00106 struct Style_Table_Entry {
00107 Fl_Color color;
00108 Fl_Font font;
00109 Fl_Fontsize size;
00110 unsigned attr;
00111 };
00112
00113 Fl_Text_Display(int X, int Y, int W, int H, const char *l = 0);
00114 ~Fl_Text_Display();
00115
00116 virtual int handle(int e);
00117
00118 void buffer(Fl_Text_Buffer* buf);
00119
00125 void buffer(Fl_Text_Buffer& buf) { buffer(&buf); }
00126
00132 Fl_Text_Buffer* buffer() const { return mBuffer; }
00133
00134 void redisplay_range(int start, int end);
00135 void scroll(int topLineNum, int horizOffset);
00136 void insert(const char* text);
00137 void overstrike(const char* text);
00138 void insert_position(int newPos);
00139
00144 int insert_position() const { return mCursorPos; }
00145
00146 int in_selection(int x, int y) const;
00147 void show_insert_position();
00148
00149 int move_right();
00150 int move_left();
00151 int move_up();
00152 int move_down();
00153 int count_lines(int start, int end, bool start_pos_is_line_start) const;
00154 int line_start(int pos) const;
00155 int line_end(int startPos, bool startPosIsLineStart) const;
00156 int skip_lines(int startPos, int nLines, bool startPosIsLineStart);
00157 int rewind_lines(int startPos, int nLines);
00158 void next_word(void);
00159 void previous_word(void);
00160
00161 void show_cursor(int b = 1);
00162
00166 void hide_cursor() { show_cursor(0); }
00167
00168 void cursor_style(int style);
00169
00174 Fl_Color cursor_color() const {return mCursor_color;}
00175
00180 void cursor_color(Fl_Color n) {mCursor_color = n;}
00181
00186 int scrollbar_width() const { return scrollbar_width_; }
00187
00192 void scrollbar_width(int W) { scrollbar_width_ = W; }
00193
00198 Fl_Align scrollbar_align() const { return scrollbar_align_; }
00199
00204 void scrollbar_align(Fl_Align a) { scrollbar_align_ = a; }
00205
00211 int word_start(int pos) const { return buffer()->word_start(pos); }
00212
00218 int word_end(int pos) const { return buffer()->word_end(pos); }
00219
00220
00221 void highlight_data(Fl_Text_Buffer *styleBuffer,
00222 const Style_Table_Entry *styleTable,
00223 int nStyles, char unfinishedStyle,
00224 Unfinished_Style_Cb unfinishedHighlightCB,
00225 void *cbArg);
00226
00227 int position_style(int lineStartPos, int lineLen, int lineIndex) const;
00228
00234 int shortcut() const {return shortcut_;}
00235
00241 void shortcut(int s) {shortcut_ = s;}
00242
00247 Fl_Font textfont() const {return textfont_;}
00248
00253 void textfont(Fl_Font s) {textfont_ = s; mColumnScale = 0;}
00254
00259 Fl_Fontsize textsize() const {return textsize_;}
00260
00265 void textsize(Fl_Fontsize s) {textsize_ = s; mColumnScale = 0;}
00266
00271 Fl_Color textcolor() const {return textcolor_;}
00272
00277 void textcolor(Fl_Color n) {textcolor_ = n;}
00278
00279 int wrapped_column(int row, int column) const;
00280 int wrapped_row(int row) const;
00281 void wrap_mode(int wrap, int wrap_margin);
00282
00283 virtual void resize(int X, int Y, int W, int H);
00284
00290 double x_to_col(double x) const;
00291
00298 double col_to_x(double col) const;
00299
00300 protected:
00301
00302
00303
00304
00305
00306 virtual void draw();
00307 void draw_text(int X, int Y, int W, int H);
00308 void draw_range(int start, int end);
00309 void draw_cursor(int, int);
00310
00311 void draw_string(int style, int x, int y, int toX, const char *string,
00312 int nChars) const;
00313
00314 void draw_vline(int visLineNum, int leftClip, int rightClip,
00315 int leftCharIndex, int rightCharIndex);
00316
00317 int find_x(const char *s, int len, int style, int x) const;
00318
00319 enum {
00320 DRAW_LINE,
00321 FIND_INDEX,
00322 FIND_INDEX_FROM_ZERO,
00323 GET_WIDTH
00324 };
00325
00326 int handle_vline(int mode,
00327 int lineStart, int lineLen, int leftChar, int rightChar,
00328 int topClip, int bottomClip,
00329 int leftClip, int rightClip) const;
00330
00331 void draw_line_numbers(bool clearAll);
00332
00333 void clear_rect(int style, int x, int y, int width, int height) const;
00334 void display_insert();
00335
00336 void offset_line_starts(int newTopLineNum);
00337
00338 void calc_line_starts(int startLine, int endLine);
00339
00340 void update_line_starts(int pos, int charsInserted, int charsDeleted,
00341 int linesInserted, int linesDeleted, int *scrolled);
00342
00343 void calc_last_char();
00344
00345 int position_to_line( int pos, int* lineNum ) const;
00346 double string_width(const char* string, int length, int style) const;
00347
00348 static void scroll_timer_cb(void*);
00349
00350 static void buffer_predelete_cb(int pos, int nDeleted, void* cbArg);
00351 static void buffer_modified_cb(int pos, int nInserted, int nDeleted,
00352 int nRestyled, const char* deletedText,
00353 void* cbArg);
00354
00355 static void h_scrollbar_cb(Fl_Scrollbar* w, Fl_Text_Display* d);
00356 static void v_scrollbar_cb( Fl_Scrollbar* w, Fl_Text_Display* d);
00357 void update_v_scrollbar();
00358 void update_h_scrollbar();
00359 int measure_vline(int visLineNum) const;
00360 int longest_vline() const;
00361 int empty_vlines() const;
00362 int vline_length(int visLineNum) const;
00363 int xy_to_position(int x, int y, int PosType = CHARACTER_POS) const;
00364
00365 void xy_to_rowcol(int x, int y, int* row, int* column,
00366 int PosType = CHARACTER_POS) const;
00367
00368 int position_to_xy(int pos, int* x, int* y) const;
00369 void maintain_absolute_top_line_number(int state);
00370 int get_absolute_top_line_number() const;
00371 void absolute_top_line_number(int oldFirstChar);
00372 int maintaining_absolute_top_line_number() const;
00373 void reset_absolute_top_line_number();
00374 int position_to_linecol(int pos, int* lineNum, int* column) const;
00375 int scroll_(int topLineNum, int horizOffset);
00376
00377 void extend_range_for_styles(int* start, int* end);
00378
00379 void find_wrap_range(const char *deletedText, int pos, int nInserted,
00380 int nDeleted, int *modRangeStart, int *modRangeEnd,
00381 int *linesInserted, int *linesDeleted);
00382 void measure_deleted_lines(int pos, int nDeleted);
00383 void wrapped_line_counter(Fl_Text_Buffer *buf, int startPos, int maxPos,
00384 int maxLines, bool startPosIsLineStart,
00385 int styleBufOffset, int *retPos, int *retLines,
00386 int *retLineStart, int *retLineEnd,
00387 bool countLastLineMissingNewLine = true) const;
00388 void find_line_end(int pos, bool start_pos_is_line_start, int *lineEnd,
00389 int *nextLineStart) const;
00390 double measure_proportional_character(const char *s, int colNum, int pos) const;
00391 int wrap_uses_character(int lineEndPos) const;
00392
00393 int damage_range1_start, damage_range1_end;
00394 int damage_range2_start, damage_range2_end;
00395 int mCursorPos;
00396 int mCursorOn;
00397 int mCursorOldY;
00398 int mCursorToHint;
00399
00400
00401 int mCursorStyle;
00402 int mCursorPreferredXPos;
00403 int mNVisibleLines;
00404 int mNBufferLines;
00405 Fl_Text_Buffer* mBuffer;
00406 Fl_Text_Buffer* mStyleBuffer;
00407
00408 int mFirstChar, mLastChar;
00409
00410
00411
00412 int mContinuousWrap;
00413 int mWrapMarginPix;
00414
00415 int* mLineStarts;
00416 int mTopLineNum;
00417
00418 int mAbsTopLineNum;
00419
00420
00421
00422 int mNeedAbsTopLineNum;
00423
00424
00425 int mHorizOffset;
00426 int mTopLineNumHint;
00427
00428 int mHorizOffsetHint;
00429 int mNStyles;
00430 const Style_Table_Entry *mStyleTable;
00431
00432 char mUnfinishedStyle;
00433
00434 Unfinished_Style_Cb mUnfinishedHighlightCB;
00435
00436 void* mHighlightCBArg;
00437
00438 int mMaxsize;
00439
00440 int mSuppressResync;
00441
00442 int mNLinesDeleted;
00443
00444
00445 int mModifyingTabDistance;
00446
00447
00448 mutable double mColumnScale;
00449
00450
00451
00452
00453 Fl_Color mCursor_color;
00454
00455 Fl_Scrollbar* mHScrollBar;
00456 Fl_Scrollbar* mVScrollBar;
00457 int scrollbar_width_;
00458 Fl_Align scrollbar_align_;
00459 int dragPos, dragType, dragging;
00460 int display_insert_position_hint;
00461 struct { int x, y, w, h; } text_area;
00462
00463 int shortcut_;
00464
00465 Fl_Font textfont_;
00466 Fl_Fontsize textsize_;
00467 Fl_Color textcolor_;
00468
00469
00470
00471
00472
00473
00474 int mLineNumLeft, mLineNumWidth;
00475 };
00476
00477 #endif
00478
00479
00480
00481