X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsettext.h;h=54ee58bec7f553e06ea28ea003eaf37bd17b6ad8;hb=4a5b7a5952ad2381fcdf4830511293e184c7c5a1;hp=0dd6361172fc4c18815b84cd43130779c5241ffe;hpb=77e706c44175f3cf71473a42d5db890c77b3b7b3;p=lyx.git diff --git a/src/insets/insettext.h b/src/insets/insettext.h index 0dd6361172..54ee58bec7 100644 --- a/src/insets/insettext.h +++ b/src/insets/insettext.h @@ -6,6 +6,7 @@ * * Copyright 1998 The LyX Team. * + * *====================================================== */ // The pristine updatable inset: Text @@ -18,231 +19,408 @@ #pragma interface #endif -#include "lyxinset.h" -#include "lyxparagraph.h" +#include "inset.h" #include "LString.h" -//#include "buffer.h" +#include "LColor.h" +#include "paragraph.h" +#include "lyxcursor.h" + +#include class Painter; class BufferView; class Buffer; +class LyXCursor; +class LyXText; +class LyXScreen; +class Row; -/** A text inset is like a TeX box - - To write full text (including styles and other insets) in a given - space. -*/ +/** + A text inset is like a TeX box to write full text + (including styles and other insets) in a given space. + @author: Jürgen Vigna + */ class InsetText : public UpdatableInset { public: /// - enum { TEXT_TO_INSET_OFFSET = 1 }; - /// - InsetText(Buffer *); - /// - InsetText(InsetText const &, Buffer *); - /// - ~InsetText(); - /// - Inset * Clone() const; - /// - void Read(LyXLex &); - /// - void Write(std::ostream &) const; - /// - int ascent(Painter &, LyXFont const &) const; - /// - int descent(Painter &, LyXFont const &) const; - /// - int width(Painter &, LyXFont const & f) const; - /// - void draw(Painter & pain, LyXFont const &, int , float &) const; - /// - char const * EditMessage() const; - /// - void Edit(BufferView *, int, int, unsigned int); - /// - void InsetUnlock(BufferView *); - /// - bool UnlockInsetInInset(BufferView *, Inset *, bool lr = false); - /// - bool UpdateInsetInInset(BufferView *, Inset *); - /// - void InsetButtonRelease(BufferView *, int, int, int); - /// - void InsetButtonPress(BufferView *, int, int, int); - /// - void InsetMotionNotify(BufferView *, int, int, int); - /// - void InsetKeyPress(XKeyEvent *); - /// - UpdatableInset::RESULT LocalDispatch(BufferView *, int, string const &); - /// - int Latex(std::ostream &, signed char, bool free_spc) const; - /// - int Linuxdoc(std::ostream &) const { return 0; } - /// - int DocBook(std::ostream &) const { return 0; } - /// - void Validate(LaTeXFeatures & features) const; - /// - Inset::Code LyxCode() const { return Inset::TEXT_CODE; } - /// - void GetCursorPos(int & x, int & y) const; - /// - int InsetInInsetY(); - /// - void ToggleInsetCursor(BufferView *); - /// - bool InsertInset(BufferView *, Inset *); - /// - UpdatableInset * GetLockingInset(); - /// - void SetFont(BufferView *, LyXFont const &, bool toggleall = false); - /// - void init(Buffer *, LyXParagraph * p = 0); - - LyXParagraph * par; + /// numbers need because of test if codeA < codeB + /// + enum UpdateCodes { + /// + NONE = 0, + /// + CURSOR = 1, + /// + CLEAR_FRAME = 2, + /// + DRAW_FRAME = 4, + /// + SELECTION = 8, + /// + CURSOR_PAR = 16, + /// + FULL = 32, + /// + INIT = 64 + }; + /// + enum DrawFrame { + /// + NEVER = 0, + /// + LOCKED, + /// + ALWAYS + }; + /// + InsetText(); + /// + explicit + InsetText(InsetText const &, bool same_id = false); + /// + ~InsetText(); + /// + Inset * clone(Buffer const &, bool same_id = false) const; + /// + InsetText & operator=(InsetText const & it); + /// + void clear(); + /// + void read(Buffer const *, LyXLex &); + /// + void write(Buffer const *, std::ostream &) const; + /// + int ascent(BufferView *, LyXFont const &) const; + /// + int descent(BufferView *, LyXFont const &) const; + /// + int width(BufferView *, LyXFont const & f) const; + /// + int textWidth(BufferView *, bool fordraw = false) const; + /// + void draw(BufferView *, LyXFont const &, int , float &, bool) const; + /// + void update(BufferView *, LyXFont const &, bool = false); + /// + void setUpdateStatus(BufferView *, int what) const; + /// + string const editMessage() const; + /// + void edit(BufferView *, int, int, unsigned int); + /// + void edit(BufferView *, bool front = true); + /// + bool isTextInset() const { return true; } + /// + bool doClearArea() const; + /// + void insetUnlock(BufferView *); + /// + bool lockInsetInInset(BufferView *, UpdatableInset *); + /// + bool unlockInsetInInset(BufferView *, + UpdatableInset *, bool lr = false); + /// + bool updateInsetInInset(BufferView *, Inset *); + /// + bool insetButtonRelease(BufferView *, int, int, int); + /// + void insetButtonPress(BufferView *, int, int, int); + /// + void insetMotionNotify(BufferView *, int, int, int); + /// + void insetKeyPress(XKeyEvent *); + /// + UpdatableInset::RESULT localDispatch(BufferView *, + kb_action, string const &); + /// + int latex(Buffer const *, std::ostream &, + bool fragile, bool free_spc) const; + /// + int ascii(Buffer const *, std::ostream &, int linelen) const; + /// + int linuxdoc(Buffer const *, std::ostream &) const { return 0; } + /// + int docbook(Buffer const *, std::ostream &) const ; + /// + void validate(LaTeXFeatures & features) const; + /// + Inset::Code lyxCode() const { return Inset::TEXT_CODE; } + /// + void getCursorPos(BufferView *, int & x, int & y) const; + /// + unsigned int insetInInsetY(); + /// + void toggleInsetCursor(BufferView *); + /// + void showInsetCursor(BufferView *, bool show = true); + /// + void hideInsetCursor(BufferView *); + /// + void fitInsetCursor(BufferView *) const; + /// + bool insertInset(BufferView *, Inset *); + /// + bool insetAllowed(Inset::Code) const; + /// + UpdatableInset * getLockingInset() const; + /// + UpdatableInset * getFirstLockingInsetOfType(Inset::Code); + /// + void setFont(BufferView *, LyXFont const &, + bool toggleall = false, + bool selectall = false); + /// + int getMaxWidth(BufferView *, UpdatableInset const *) const; + /// + void init(InsetText const * ins = 0, bool same_id = false); + /// + void writeParagraphData(Buffer const *, std::ostream &) const; + /// + void setParagraphData(Paragraph *, bool same_id = false); + /// + void setText(string const &); + /// + void setAutoBreakRows(bool); + /// + bool getAutoBreakRows() const { return autoBreakRows; } + /// + void setDrawFrame(BufferView *, DrawFrame); + /// + void setFrameColor(BufferView *, LColor::color); + /// + LyXText * getLyXText(BufferView const *, + bool const recursive = false) const; + /// + void deleteLyXText(BufferView *, bool recursive = true) const; + /// + void resizeLyXText(BufferView *, bool force = false) const; + /// + bool showInsetDialog(BufferView *) const; + /// + std::vector const getLabelList() const; + /// + bool nodraw() const; + /// + int scroll(bool recursive = true) const; + /// + void scroll(BufferView * bv, float sx) const { + UpdatableInset::scroll(bv, sx); + } + /// + void scroll(BufferView * bv, int offset) const { + UpdatableInset::scroll(bv, offset); + } + /// + void selectAll(BufferView * bv); + /// + void clearSelection(BufferView * bv); + /// + Paragraph * getParFromID(int id) const; + /// + Inset * getInsetFromID(int id) const; + /// + Paragraph * firstParagraph() const; + /// + Paragraph * getFirstParagraph(int) const; + /// + LyXCursor const & cursor(BufferView *) const; + /// + Paragraph * paragraph() const; + /// + void paragraph(Paragraph *); + /// + bool allowSpellcheck() { return true; } + /// + string const selectNextWordToSpellcheck(BufferView *, + float & value) const; + void selectSelectedWord(BufferView *); + /// + void toggleSelection(BufferView *, bool kill_selection); + /// + bool searchForward(BufferView *, string const &, + bool = true, bool = false); + /// + bool searchBackward(BufferView *, string const &, + bool = true, bool = false); + /// + bool checkInsertChar(LyXFont &); + /// + // + // Public structures and variables + /// + mutable int need_update; protected: - /// - void UpdateLocal(BufferView *, bool); - /// - void WriteParagraphData(std::ostream &) const; - /// - void resetPos(BufferView *); - /// - void drawSelection(Painter &, int pos, int baseline, float x); - /// - void SingleHeight(Painter &, LyXParagraph * par,int pos, - int & asc, int & desc) const; - /// - int SingleWidth(Painter &, LyXParagraph * par, int pos) const; - /// - LyXFont GetFont(LyXParagraph * par, int pos) const; - - Buffer * buffer; - /// - LyXFont current_font; - /// - LyXFont real_current_font; - /// - mutable int maxWidth; - /// - mutable int maxAscent; - /// - mutable int maxDescent; - /// - mutable int insetWidth; - /// - int widthOffset; - /// - bool autoBreakRows; + /// + void updateLocal(BufferView *, int what, bool mark_dirty) const; + /// + void lockInset(BufferView *, UpdatableInset *); + /// + mutable int drawTextXOffset; + /// + mutable int drawTextYOffset; + /// + bool autoBreakRows; + /// + DrawFrame drawFrame_; + /// + LColor::color frame_color; private: - /// - void drawRowSelection(Painter &, int startpos, int endpos, int row, - int baseline, float x) const; - /// - void drawRowText(Painter &, int startpos, int endpos, int baseline, - float x) const; - /// - void computeTextRows(Painter &, float x = 0.0) const; - /// - void computeBaselines(int) const; - /// - int BeginningOfMainBody(LyXParagraph * par) const; - /// - void ShowInsetCursor(BufferView *); - /// - void HideInsetCursor(BufferView *); - /// - void setPos(BufferView *, int x, int y, bool activate_inset = true); - /// - bool moveRight(BufferView *, bool activate_inset = true); - bool moveLeft(BufferView *, bool activate_inset = true); - bool moveUp(BufferView *, bool activate_inset = true); - bool moveDown(BufferView *, bool activate_inset = true); - bool Delete(); - bool cutSelection(); - bool copySelection(); - bool pasteSelection(); - /// - bool hasSelection() const { return selection_start != selection_end; } - /// - void SetCharFont(int pos, LyXFont const & font); - /// - string getText(int); + /// + struct InnerCache { + /// + InnerCache(boost::shared_ptr); + /// + boost::shared_ptr text; + /// + bool remove; + }; + /// + typedef std::map Cache; + /// + typedef Cache::value_type value_type; + /// + int beginningOfMainBody(Buffer const *, Paragraph * par) const; + /// + UpdatableInset::RESULT moveRight(BufferView *, + bool activate_inset = true, + bool selecting = false); + /// + UpdatableInset::RESULT moveLeft(BufferView *, + bool activate_inset = true, + bool selecting = false); + /// + UpdatableInset::RESULT moveRightIntern(BufferView *, bool behind, + bool activate_inset = true, + bool selecting = false); + /// + UpdatableInset::RESULT moveLeftIntern(BufferView *, bool behind, + bool activate_inset = true, + bool selecting = false); + + /// + UpdatableInset::RESULT moveUp(BufferView *); + /// + UpdatableInset::RESULT moveDown(BufferView *); + /// + void setCharFont(Buffer const *, int pos, LyXFont const & font); + /// + bool checkAndActivateInset(BufferView * bv, bool behind); + /// + bool checkAndActivateInset(BufferView * bv, int x = 0, int y = 0, + int button = 0); + /// + void removeNewlines(); + /// + int cx(BufferView *) const; + /// + int cy(BufferView *) const; + /// + lyx::pos_type cpos(BufferView *) const; + /// + Paragraph * cpar(BufferView *) const; + /// + bool cboundary(BufferView *) const; + /// + Row * crow(BufferView *) const; + /// + void drawFrame(Painter &, bool cleared) const; + /// + void clearFrame(Painter &, bool cleared) const; + /// + void clearInset(BufferView *, int baseline, bool & cleared) const; + /// + void saveLyXTextState(LyXText *) const; + /// + void restoreLyXTextState(BufferView *, LyXText *) const; + /// + void reinitLyXText() const; + /// + void collapseParagraphs(BufferParams const & bparams) const; + + /* Private structures and variables */ + /// + Paragraph * par; + /// + mutable bool locked; + /// + mutable int insetAscent; + /// + mutable int insetDescent; + /// + mutable int insetWidth; + /// + mutable int top_y; + /// + Paragraph * inset_par; + /// + lyx::pos_type inset_pos; + /// + bool inset_boundary; + /// + mutable int inset_x; + /// + mutable int inset_y; + /// + mutable int old_max_width; + /// + bool no_selection; + /// + mutable float xpos; + /// + UpdatableInset * the_locking_inset; + /// + mutable Paragraph * old_par; + /// The cache. + mutable Cache cache; + /// + mutable int last_drawn_width; + /// + mutable bool frame_is_visible; + /// + mutable BufferView * cached_bview; + /// + mutable boost::shared_ptr cached_text; + /// + struct save_state { + Paragraph * lpar; + Paragraph * selstartpar; + Paragraph * selendpar; + lyx::pos_type pos; + lyx::pos_type selstartpos; + lyx::pos_type selendpos; + bool boundary; + bool selstartboundary; + bool selendboundary; + bool selection; + bool mark_set; + bool refresh; + }; + /// + mutable save_state sstate; - /* Private structures and variables */ - /// - int inset_pos; - /// - int inset_x; - /// - int inset_y; - /// - int interline_space; - /// - int selection_start; - /// - int selection_end; - /// - int old_x; - /// - int cx; - /// - int cy; - /// - int actpos; - /// - int actrow; - /// - bool no_selection; - /// - mutable float xpos; - /// - mutable bool init_inset; - /// - UpdatableInset * the_locking_inset; - /// - struct row_struct { - /// - int asc; - /// - int desc; - /// - int pos; - /// - int baseline; - }; - /// - typedef std::vector RowList; - /// - mutable RowList rows; - InsetText & operator = (InsetText const & it) { - par = it.par; - buffer = it.buffer; // suspect - current_font = it.current_font; - real_current_font = it.real_current_font; - maxWidth = it.maxWidth; - maxAscent = it.maxAscent; - maxDescent = it.maxDescent; - insetWidth = it.insetWidth; - inset_pos = it.inset_pos; - inset_x = it.inset_x; - inset_y = it.inset_y; - interline_space = it.interline_space; - selection_start = it.selection_start; - selection_end = it.selection_end; - old_x = it.old_x; - cx = it.cx; - cy = it.cy; - actpos = it.actpos; - actrow = it.actrow; - no_selection = it.no_selection; - the_locking_inset = it.the_locking_inset; // suspect - rows = it.rows; - return * this; - } + /// + // this is needed globally so we know that we're using it actually and + // so the LyXText-Cache is not erased until used! + mutable LyXText * lt; + /// + // to remember old painted frame dimensions to clear it on the right spot! + /// + mutable int frame_x; + mutable int frame_y; + mutable int frame_w; + mutable int frame_h; + /// + bool in_update; /* as update is not reentrant! */ + mutable BufferView * do_resize; + mutable bool do_reinit; + mutable bool in_insetAllowed; + /// + // these are used to check for mouse movement in Motion selection code + /// + int mouse_x; + int mouse_y; }; #endif