1 // -*- C++ -*- 2 /** 3 * \file InsetText.h 4 * This file is part of LyX, the document processor. 5 * Licence details can be found in the file COPYING. 6 * 7 * \author Jürgen Vigna 8 * 9 * Full author contact details are available in file CREDITS. 10 */ 11 12 #ifndef INSETTEXT_H 13 #define INSETTEXT_H 14 15 #include "Inset.h" 16 17 #include "ColorCode.h" 18 #include "Text.h" 19 20 namespace lyx { 21 22 class CompletionList; 23 class CursorSlice; 24 class Dimension; 25 class ParagraphList; 26 class InsetCaption; 27 class InsetTabular; 28 class TocBuilder; 29 30 /** 31 A text inset is like a TeX box to write full text 32 (including styles and other insets) in a given space. 33 */ 34 class InsetText : public Inset { 35 public: 36 enum UsePlain { 37 DefaultLayout, 38 PlainLayout 39 }; 40 /// \param buffer 41 /// \param useplain whether to use the plain layout 42 /// This is needed because we cannot call the virtual function 43 /// usePlainLayout() from within the constructor. 44 explicit InsetText(Buffer * buffer, UsePlain type = DefaultLayout); 45 /// 46 InsetText(InsetText const &); 47 /// 48 void setBuffer(Buffer &); 49 50 /// 51 Dimension const dimensionHelper(BufferView const &) const; 52 53 /// empty inset to empty par 54 void clear(); 55 /// 56 void read(Lexer & lex); 57 /// 58 void write(std::ostream & os) const; 59 /// 60 void metrics(MetricsInfo & mi, Dimension & dim) const; 61 /// 62 void draw(PainterInfo & pi, int x, int y) const; 63 /// Drawing background is handled in draw drawBackground(PainterInfo &,int,int)64 virtual void drawBackground(PainterInfo &, int, int) const {} 65 /// editable()66 bool editable() const { return true; } 67 /// canTrackChanges()68 bool canTrackChanges() const { return true; } 69 /// Rely on RowPainter to draw the cue of inline insets. canPaintChange(BufferView const &)70 bool canPaintChange(BufferView const &) const { return allowMultiPar(); } 71 /// asInsetText()72 InsetText * asInsetText() { return this; } 73 /// asInsetText()74 InsetText const * asInsetText() const { return this; } 75 /// text()76 Text & text() { return text_; } text()77 Text const & text() const { return text_; } 78 /// 79 void latex(otexstream &, OutputParams const &) const; 80 /// 81 int plaintext(odocstringstream & ods, OutputParams const & op, 82 size_t max_length = INT_MAX) const; 83 /// 84 int docbook(odocstream &, OutputParams const &) const; 85 /// 86 docstring xhtml(XHTMLStream &, OutputParams const &) const; 87 /// 88 enum XHTMLOptions { 89 JustText = 0, 90 WriteOuterTag = 1, 91 WriteLabel = 2, 92 WriteInnerTag = 4, 93 WriteEverything = 7 94 }; 95 /// 96 docstring insetAsXHTML(XHTMLStream &, OutputParams const &, 97 XHTMLOptions) const; 98 /// 99 void validate(LaTeXFeatures & features) const; 100 101 /// return the argument(s) only 102 void getArgs(otexstream & os, OutputParams const &, bool const post = false) const; 103 104 /// return x,y of given position relative to the inset's baseline 105 void cursorPos(BufferView const & bv, CursorSlice const & sl, 106 bool boundary, int & x, int & y) const; 107 /// lyxCode()108 InsetCode lyxCode() const { return TEXT_CODE; } 109 /// 110 void setText(docstring const &, Font const &, bool trackChanges); 111 /// 112 void setDrawFrame(bool); 113 /// 114 ColorCode frameColor() const; 115 /// 116 void setFrameColor(ColorCode); 117 /// getText(int i)118 Text * getText(int i) const { 119 return (i == 0) ? const_cast<Text*>(&text_) : 0; 120 } 121 /// 122 virtual bool getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus &) const; 123 124 /// 125 void fixParagraphsFont(); 126 127 /// set the change for the entire inset 128 void setChange(Change const & change); 129 /// accept the changes within the inset 130 void acceptChanges(); 131 /// reject the changes within the inset 132 void rejectChanges(); 133 134 /// append text onto the existing text 135 void appendParagraphs(ParagraphList &); 136 137 /// 138 void addPreview(DocIterator const &, graphics::PreviewLoader &) const; 139 140 /// 141 void edit(Cursor & cur, bool front, EntryDirection entry_from); 142 /// 143 Inset * editXY(Cursor & cur, int x, int y); 144 145 /// number of cells in this inset nargs()146 size_t nargs() const { return 1; } 147 /// 148 ParagraphList & paragraphs(); 149 /// 150 ParagraphList const & paragraphs() const; 151 /// 152 bool insetAllowed(InsetCode) const; 153 /// allowSpellCheck()154 bool allowSpellCheck() const { return getLayout().spellcheck() && !getLayout().isPassThru(); } 155 /// isMacroScope()156 virtual bool isMacroScope() const { return false; } 157 /// allowMultiPar()158 virtual bool allowMultiPar() const { return getLayout().isMultiPar(); } 159 /// 160 /// should paragraphs be forced to use the empty layout? 161 virtual bool forcePlainLayout(idx_type = 0) const 162 { return getLayout().forcePlainLayout(); } 163 /// should the user be allowed to customize alignment, etc.? 164 virtual bool allowParagraphCustomization(idx_type = 0) const 165 { return getLayout().allowParagraphCustomization(); } 166 /// should paragraphs be forced to use a local font language switch? forceLocalFontSwitch()167 virtual bool forceLocalFontSwitch() const 168 { return getLayout().forcelocalfontswitch(); } 169 170 /// Update the counters of this inset and of its contents 171 virtual void updateBuffer(ParIterator const &, UpdateType); 172 /// 173 void setMacrocontextPositionRecursive(DocIterator const & pos); 174 /// 175 void toString(odocstream &) const; 176 /// 177 void forOutliner(docstring &, size_t const, bool const) const; 178 /// 179 void addToToc(DocIterator const & di, bool output_active, 180 UpdateType utype, TocBackend & backend) const; 181 /// clone()182 Inset * clone() const { return new InsetText(*this); } 183 /// 184 bool notifyCursorLeaves(Cursor const & old, Cursor & cur); 185 186 /// 187 bool completionSupported(Cursor const &) const; 188 /// 189 bool inlineCompletionSupported(Cursor const & cur) const; 190 /// 191 bool automaticInlineCompletion() const; 192 /// 193 bool automaticPopupCompletion() const; 194 /// 195 bool showCompletionCursor() const; 196 /// 197 CompletionList const * createCompletionList(Cursor const & cur) const; 198 /// 199 docstring completionPrefix(Cursor const & cur) const; 200 /// 201 bool insertCompletion(Cursor & cur, docstring const & s, bool finished); 202 /// 203 void completionPosAndDim(Cursor const &, int & x, int & y, Dimension & dim) const; 204 /// returns the text to be used as tooltip 205 /// \param prefix: a string that will preced the tooltip, 206 /// e.g., "Index: ". 207 /// \param len: length of the resulting string 208 /// NOTE This routine is kind of slow. It's fine to use it within the 209 /// GUI, but definitely do not try to use it in updateBuffer or anything 210 /// of that sort. (Note: unnecessary internal copies have been removed 211 /// since the previous note. The efficiency would have to be assessed 212 /// again by profiling.) 213 docstring toolTipText(docstring prefix = empty_docstring(), 214 size_t len = 400) const; 215 216 /// 217 std::string contextMenu(BufferView const &, int, int) const; 218 /// 219 std::string contextMenuName() const; 220 /// 221 void doDispatch(Cursor & cur, FuncRequest & cmd); 222 223 /// confirmDeletion()224 bool confirmDeletion() const { return !text().empty(); } 225 226 protected: 227 /// 228 void iterateForToc(DocIterator const & cdit, bool output_active, 229 UpdateType utype, TocBackend & backend) const; 230 private: 231 /// Open the toc item for paragraph pit. Returns the paragraph index where 232 /// it should end. 233 pit_type openAddToTocForParagraph(pit_type pit, 234 DocIterator const & dit, 235 bool output_active, 236 TocBackend & backend) const; 237 /// Close a toc item opened in start and closed in end 238 void closeAddToTocForParagraph(pit_type start, pit_type end, 239 TocBackend & backend) const; 240 /// 241 bool drawFrame_; 242 /// 243 ColorCode frame_color_; 244 /// 245 Text text_; 246 }; 247 248 249 InsetText::XHTMLOptions operator|(InsetText::XHTMLOptions a1, InsetText::XHTMLOptions a2); 250 251 } // namespace lyx 252 253 #endif 254