wxMaxima
Loading...
Searching...
No Matches
EditorCell.h
Go to the documentation of this file.
1// -*- mode: c++; c-file-style: "linux"; c-basic-offset: 2; indent-tabs-mode: nil -*-
2//
3// Copyright (C) 2006-2015 Andrej Vodopivec <andrej.vodopivec@gmail.com>
4// (C) 2012 Doug Ilijev <doug.ilijev@gmail.com>
5// (C) 2014-2015 Gunter Königsmann <wxMaxima@physikbuch.de>
6//
7// This program is free software; you can redistribute it and/or modify
8// it under the terms of the GNU General Public License as published by
9// the Free Software Foundation; either version 2 of the License, or
10// (at your option) any later version.
11//
12// This program is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15// GNU General Public License for more details.
16//
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21//
22// SPDX-License-Identifier: GPL-2.0+
23
24#ifndef EDITORCELL_H
25#define EDITORCELL_H
26
27#include "Cell.h"
28#include "FontAttribs.h"
29#include "MaximaTokenizer.h"
30#include "TextFormat.h"
31#include <wx/dataobj.h>
32#include <array>
33#include <optional>
34#include <vector>
35#include <algorithm>
36#include <list>
37#include <unordered_map>
38#include <utility>
39
40struct BidiRun;
41
66class EditorCell : public Cell
67{
68private:
69#if wxUSE_ACCESSIBILITY
70 wxAccStatus GetName (int childId, wxString *name) const override;
71 wxAccStatus GetDescription(int childId, wxString *description) const override;
72 wxAccStatus GetFocus (int *childId, Cell **child) const override;
73 wxAccStatus GetDefaultAction(int childId, wxString *actionName) const override;
74 wxAccStatus GetValue (int childId, wxString *strValue) const override;
75 wxAccStatus GetRole (int childId, wxAccRole *role) const override;
76 wxAccStatus GetState (int childId, long *state) const override;
77#endif
78
79public:
81 EditorCell(GroupCell *group, Configuration *config, wxString text = {});
82 EditorCell(GroupCell *group, const EditorCell &cell);
83
92 static std::unique_ptr<EditorCell> Create(GroupCell *group,
93 Configuration *config, CellType type,
94 wxString text = {});
95
97 static bool IsCodeType(CellType type);
98
106 virtual bool IsCodeEditor() const { return false; }
107 void UpdateSelectionString();
108 // The selection/cursor setters clamp their argument to a valid index into the
109 // current text via ClampToText(), so m_selectionStart / m_selectionEnd are
110 // always in [0, m_text.Length()] (e.g. CursorMove(-n) past the start clamps to
111 // 0 instead of wrapping a size_t to a huge value). The getters below keep a
112 // defensive std::min as well, because the text can still shrink *after* a
113 // selection was set without the selection being updated.
114 void SetSelection(size_t start, size_t end){m_selectionStart = ClampToText(start); m_selectionEnd = ClampToText(end); UpdateSelectionString();}
115 bool SelectionActive() const {return m_selectionStart != m_selectionEnd;}
116 void ClearSelection() {SelectionEnd(SelectionEnd());}
117 void SelectionStart(size_t start) {m_selectionStart = ClampToText(start); UpdateSelectionString();}
118 void SelectionEnd(size_t end) {m_selectionEnd = ClampToText(end); UpdateSelectionString();}
119 size_t SelectionStart() const {return std::min(m_selectionStart, m_text.Length());}
120 size_t SelectionEnd() const {return std::min(m_selectionEnd, m_text.Length());}
121 size_t SelectionLeft() const {return std::min(SelectionStart(), SelectionEnd());}
122 size_t SelectionRight() const {return std::max(SelectionStart(), SelectionEnd());}
123 size_t SelectionLength() const {return(SelectionEnd()-SelectionStart());}
124 void SelectionLength(size_t length) {SelectionEnd(SelectionStart() + length); UpdateSelectionString();}
125 void CursorMove(long long increment) {m_selectionEnd = ClampToText(static_cast<long long>(m_selectionEnd) + increment);
126 m_selectionStart = m_selectionEnd; UpdateSelectionString();}
127 size_t CursorPosition() const {return std::min(m_selectionEnd, m_text.Length());}
128 void CursorPosition(size_t pos) {m_selectionStart = ClampToText(pos);
129 m_selectionEnd = m_selectionStart; UpdateSelectionString();}
130 const CellTypeInfo &GetInfo() override;
131 std::unique_ptr<Cell> Copy(GroupCell *group) const override;
132
134 // cppcheck-suppress duplInheritedMember
135 EditorCell *GetPrevious() const { return dynamic_cast<EditorCell*>(Cell::GetPrevious()); }
137 // cppcheck-suppress duplInheritedMember
138 EditorCell *GetNext() const { return dynamic_cast<EditorCell*>(Cell::GetNext()); }
139
141 void InsertEscCommand(const wxString &txt) {
142 InsertText(InterpretEscapeString(txt));
143 }
144
146 wxString GetFullCommandUnderCursor();
147
149 void AddDrawParameter(wxString param);
150
152 void AutoAnswer(bool autoAnswer){m_autoAnswer = autoAnswer;}
153
158 void SearchStartedHere(size_t index) const;
160 void SearchStartedHere() const;
162 void MouseSelectionStartedHere() const;
164 void KeyboardSelectionStartedHere() const;
165
167 const auto &GetWordList() const { return m_wordList; }
168
176 static wxString NormalizeLineEndings(const wxString &input_);
177
179 static wxString EscapeHTMLChars(wxString input);
180
182 static wxString PrependNBSP(wxString input);
183
184 void Recalculate(const AFontSize fontsize) const override;
185
187 void SetCurrentPoint(wxPoint point) const override;
188 virtual void Draw(wxDC *dc, wxDC *antialiassingDC) override;
189
191 wxString ToHTML() const;
192 wxString ToMatlab() const override;
200 wxString ToMatlab(bool dontLimitToSelection) const;
202 wxString ToRTF() const override;
203 wxString ToString() const override;
204 wxString ToString(bool dontLimitToSelection) const;
206 wxString ToTeX() const override;
208 wxString ToXML() const override;
209
211 const wxFont &GetFont() const {
213 }
220 const wxFont &GetFont(TextFormat::Format format) const;
222 void SetFont(wxDC *dc) const;
223
225 void SetForeground(wxDC *dc);
226
231 void SetValue(const wxString &text) override;
232
237 const wxString &GetValue() const override { return m_text; }
238
252 bool CanFormat() const { return !IsCodeEditor(); }
254 const TextFormat::Formats &GetFormats() const;
260 void SetFormats(TextFormat::Formats formats);
266 bool HasFormat(TextFormat::Format flag) const;
282 void SetUnknownLineAttributes(std::vector<std::pair<wxString, wxString>> attributes);
289 void CopyFormatsFrom(const EditorCell &source);
300 wxString SelectionToXML() const;
307 wxString FormattedRTF(size_t start, size_t end, bool markDown) const;
313 wxString FormattedHTML(size_t start, size_t end) const;
315 wxString SelectionToRTF() const;
317 wxString SelectionToHTML() const;
327 bool InsertXML(const wxString &xml);
335 bool InsertHTML(const wxString &html, wxString plainText = wxEmptyString);
341 static wxDataFormat FormattedTextDataFormat();
343
351 const std::vector<std::size_t> &GetSoftBreaks() const { return m_softBreaks; }
352
363 void SetDiffHighlights(std::vector<std::pair<std::size_t, std::size_t>> ranges) {
364 m_diffHighlights = std::move(ranges);
365 m_diffHighlightsTextLength = m_text.Length();
366 }
368 const std::vector<std::pair<std::size_t, std::size_t>> &GetDiffHighlights() const {
369 return m_diffHighlights;
370 }
371
382 void AddErrorStatement(std::size_t start, std::size_t end);
388 void AddErrorSpot(std::size_t start, std::size_t end);
390 void ClearErrorMarks();
392 const std::vector<std::pair<std::size_t, std::size_t>> &GetErrorStatements() const;
394 const std::vector<std::pair<std::size_t, std::size_t>> &GetErrorSpots() const;
396 bool ErrorMarksValid() const {
397 return m_errorMarks && (m_text == m_errorMarks->text);
398 }
399
408 void StyleText() const;
410 void StyleTextCode() const;
411 void StyleTextTexts() const;
412
413protected:
420 virtual void StyleTypedText() const;
421
428 virtual wxString PreprocessNewValue(const wxString &text,
429 std::size_t &cursorPos) const;
430
437 virtual wxString XMLTypeAttribute() const;
438
439public:
440 void Reset();
441
443 void ProcessEvent(wxKeyEvent &event) override;
444
452 bool ActivateCursor();
453
455 void DeactivateCursor();
456
458 size_t BeginningOfLine(size_t pos) const;
459
461 size_t EndOfLine(size_t pos);
462
464 bool AddEnding() override;
465
467 void PositionToXY(size_t position, size_t *x, size_t *y);
468
470 size_t XYToPosition(size_t x, size_t y);
471
473 wxPoint PositionToPoint(size_t pos) override;
478 wxPoint LineColumnToPoint(size_t line, size_t column, size_t pos);
479 wxPoint PositionToPoint() override {return PositionToPoint(CursorPosition());}
480
482 void SelectPointText(wxPoint point) override;
483
490 wxString GetLinkAt(wxPoint point) override;
491
493 void SelectRectText(wxPoint one, wxPoint two) override;
494
496 wxString SelectWordUnderCaret(bool selectParens = true, bool toRight = true,
497 bool includeDoubleQuotes = false);
498
500 bool IsPointInSelection(wxPoint point);
501
502 bool CopyToClipboard() const override;
503
504 bool CutToClipboard() override;
505
506 void PasteFromClipboard(bool primary = false) override;
507
509 size_t GetSelectionStart() const
510 { return SelectionStart(); }
511
513 long GetSelectionEnd() const
514 { return SelectionEnd(); }
515
517 void SelectAll() override
518 {
519 SetSelection(0, m_text.Length());
520 }
521
523 bool AllSelected() const
524 {
525 return (SelectionStart() == 0) && (SelectionEnd() == m_text.Length());
526 }
527
530 {
531 ClearSelection();
532 }
533
534
535 bool CanCopy() const override
536 {
537 return SelectionActive();
538 }
539
540 bool FindMatchingQuotes();
541
542 void FindMatchingParens();
543
549 std::pair<long, long> GetMatchingParens() const { return {m_paren1, m_paren2}; }
550
551 wxCoord GetLineWidth(size_t line, size_t pos);
552
558 wxCoord DigitGroupGapWidth() const;
560 wxSize GetTextSize(const wxString &text) const;
561
566 wxCoord NextTabStop(wxCoord startX) const;
567
576 wxCoord MeasureTextWidth(wxCoord startX, const wxString &text) const;
577
584 static bool IsStrongRightToLeft(wxUniChar c);
585
587 static bool IsStrongLeftToRight(wxUniChar c);
588
603 bool LineIsRightToLeft(size_t line);
604
606 bool LineIsMixedDirection(size_t line);
607
609 size_t LineLength(size_t line);
610
624 wxPoint SelectionLineSpan(size_t lineStart, size_t lineEnd, wxCoord *width);
625
634 bool GetLineBidiRuns(size_t line, std::vector<BidiRun> *runs);
635
642 bool MixedDirectionOffset(size_t line, size_t position, wxCoord *offset);
643
650 std::vector<wxCoord> RightToLeftLineOffsets();
651
653 wxCoord RightToLeftLineOffset(size_t line);
654
657 bool IsDirty() const override
658 {
659 return m_isDirty;
660 }
661
663 void SwitchCaretDisplay() override
664 {
665 m_displayCaret = !m_displayCaret;
666 }
667
668 void SetFocus(bool focus) override
669 {
670 m_hasFocus = focus;
671 }
672
673 bool IsActive() const override;
674
676 bool CaretAtStart() const
677 { return CursorPosition() == 0; }
678
680 void CaretToStart();
681
683 bool CaretAtEnd() const
684 { return CursorPosition() == m_text.Length(); }
685
687 void CaretToEnd();
688
690 void CaretToPosition(size_t pos);
691
693 bool CanUndo() const {return m_history.CanUndo();}
694
696 void Undo();
697
699 bool CanRedo() const {return m_history.CanRedo();}
700
702 void Redo();
703
706 {
707 public:
708 enum Action : uintptr_t {
709 any = 0,
710 removeChar = 1,
711 addChar = 2
712 };
713
715 class HistoryEntry // 64 bytes
716 {
717 public:
718 HistoryEntry(){};
719 HistoryEntry(const wxString &text, long long selStart, long long selEnd,
720 TextFormat::Formats formats = {}) :
721 m_text(text), m_formats(std::move(formats)), m_selStart(selStart), m_selEnd(selEnd) {}
722 long long SelectionStart() const {return m_selStart;}
723 long long SelectionEnd() const {return m_selEnd;}
724 wxString GetText() const {return m_text;}
725 const TextFormat::Formats &GetFormats() const {return m_formats;}
727 bool SameContent(const HistoryEntry &other) const
728 {return (m_text == other.m_text) && (m_formats == other.m_formats);}
729 private:
730 wxString m_text;
732 TextFormat::Formats m_formats;
733 long long m_selStart = -1;
734 long long m_selEnd = -1;
735 };
736 bool AddState(HistoryEntry entry, Action action = any);
737 bool AddState(const wxString &text, long long selStart, long long selEnd, Action action = any,
738 TextFormat::Formats formats = {});
739 bool Undo();
740 bool Redo();
741 bool CanUndo() const;
742 bool CanRedo() const;
743 void ClearUndoBuffer();
744 HistoryEntry GetState() const;
745 private:
746 std::vector<HistoryEntry> m_history;
748 size_t m_historyPosition = 0;
749 Action m_lastAction = any;
750 };
751
753 void SaveValue(History::Action action = History::Action::any);
754
761 wxString DivideAtCaret();
762
763 void CommentSelection();
764
766 bool ContainsChanges() const
767 { return m_containsChanges; }
768
770 void ContainsChanges(bool changes)
771 { m_containsChanges = m_containsChangesCheck = changes; }
772
773 bool CheckChanges();
774
777 size_t ReplaceAll(wxString oldString, const wxString &newString, bool ignoreCase);
778 size_t ReplaceAll_RegEx(const wxString &oldString, const wxString &newString);
779
790 bool FindNext(wxString str, const bool &down, const bool &ignoreCase);
791 bool FindNext_RegEx(wxString str, const bool &down);
792
793 bool IsSelectionChanged() const { return m_selectionChanged; }
794
795 void GetSelection(size_t *start, size_t *end) const
796 {
797 *start = SelectionStart();
798 *end = SelectionEnd();
799 }
800
813 bool ReplaceSelection(const wxString &oldStr, const wxString &newString,
814 bool keepSelected = false, bool ignoreCase = false,
815 bool replaceMaximaString = false);
816 bool ReplaceSelection_RegEx(const wxString &oldStr, const wxString &newString);
817
819 wxString GetSelectionString() const;
820
823
825 wxString GetWordUnderCaret();
826
828 wxString GetCurrentCommand() const;
829
831 void SetErrorIndex(size_t index){m_errorIndex = index; m_errorIndexSet = true;}
833 void ClearErrorIndex(){m_errorIndexSet = false;}
834
835 bool ErrorIndexSet() const {return m_errorIndexSet;}
836
837 void GotoError(){SetCaretPosition(m_errorIndex); ActivateCursor(); ClearErrorIndex();}
838
840 void ProcessNewline(bool keepCursorAtStartOfLine = true);
841
843 size_t GetCaretPosition() const
844 { return CursorPosition(); }
845
848
850 void SetCaretPosition(size_t pos){CursorPosition(pos);}
851
852 bool FindNextTemplate(bool left = false);
853
854 void InsertText(wxString text);
855
856 wxString TextInFrontOfSelection() const
857 {
858 return GetValue().Left(SelectionLeft());
859 }
860
863 {
864 SetSelection(m_lastSelectionStart, 0);
865 }
866
867 void SetType(CellType type) override;
868 void SetStyle(TextStyle style) override;
869
870 bool NeedsRecalculation(AFontSize fontSize) const override;
871
874 {
875 SetSelection(m_lastSelectionStart, m_text.Length());
876 }
877
879// const MaximaTokenizer::TokenList &GetDisplayedTokens() const;
881 const MaximaTokenizer::TokenList &GetAllTokens() const;
882
883private:
889 void InsertFormatted(const wxString &text, const TextFormat::Formats &pasted);
897 void PushTextLine(const wxString &line, const wxString &indentChar,
898 std::size_t startPos) const;
906 wxCoord PushCodeLine(TextStyle style, const wxString &line) const;
914 void PushTextRun(const wxString &run, const wxString &indentChar,
915 std::size_t startPos) const;
920 void PushFormattedPiece(const wxString &piece, const wxString &indentChar,
921 std::size_t startPos, bool isLink) const;
922
931 template <typename SnippetFunc>
932 void WalkDrawnSnippets(wxDC *dc, SnippetFunc &&onSnippet);
933
937 size_t ClampToText(long long pos) const {
938 if (pos < 0)
939 return 0;
940 return std::min(static_cast<size_t>(pos), m_text.Length());
941 }
942 size_t m_selectionStart = 0;
943 size_t m_selectionEnd = 0;
944 size_t m_lastSelectionStart = 0;
945protected:
960 {
961 private:
964 wxString m_text;
966 TextStyle m_style = TS_CODE_DEFAULT;
968 wxString m_indentChar;
970 mutable CachedInteger<wxCoord> m_width;
972 wxCoord m_indentPixels = 0;
974 bool m_styleThisText = false;
976 bool m_isLink = false;
978 TextFormat::Format m_format = TextFormat::None;
986 wxCoord m_yOffset = 0;
987 public:
989 StyledText(TextStyle style, const wxString &text)
990 : m_text(text), m_style(style), m_styleThisText(true) {}
991
993 explicit StyledText(const wxString &text, TextStyle style, wxCoord indentPixels = 0,
994 const wxString &indentChar = {})
995 : m_text(text), m_style(style), m_indentChar(indentChar), m_indentPixels(indentPixels) {}
996
997 void SetWidth(wxCoord width){m_width = width;}
998 void ResetSize(){m_width.Invalidate();}
999 wxCoord GetWidth() const {return m_width;}
1000 bool SizeKnown() const {return m_width.IsValid();}
1002 const wxString &GetText() const { return m_text; }
1004 void SetText(const wxString &text) { m_text = text; }
1006 void SetIndentation(wxCoord indentPixels, const wxString &indentString = {})
1007 {
1008 m_indentPixels = indentPixels;
1009 m_indentChar = indentString;
1010 }
1012 wxCoord GetIndentPixels() const { return m_indentPixels; }
1013 const wxString &GetIndentChar() const { return m_indentChar; }
1016 TextStyle GetTextStyle() const { return m_style; }
1017 // Has an individual text style been set for this text portion?
1018 bool IsStyleSet() const { return m_styleThisText; }
1020 bool IsLink() const { return m_isLink; }
1022 void SetLink() { m_isLink = true; }
1024 TextFormat::Format GetFormat() const { return m_format; }
1026 void SetFormat(TextFormat::Format format) { m_format = format; }
1028 wxCoord GetYOffset() const { return m_yOffset; }
1030 void SetYOffset(wxCoord yOffset) { m_yOffset = yOffset; }
1039 const std::vector<size_t> &GetDigitGaps() const { return m_digitGaps; }
1041 void SetDigitGaps(std::vector<size_t> gaps) { m_digitGaps = std::move(gaps); }
1042 private:
1044 std::vector<size_t> m_digitGaps;
1045 };
1046
1047private:
1048#if defined __WXOSX__
1049 bool HandleCtrlCommand(wxKeyEvent &ev);
1050#endif
1051 bool HandleSpecialKey(wxKeyEvent &event);
1052 bool HandleOrdinaryKey(wxKeyEvent &event);
1053
1054 void FontsChanged() const override
1055 {
1056 m_widths.clear();
1057 }
1058
1074 struct SoftBreakCandidate {
1075 std::size_t snippetIdx = 0;
1076 std::size_t textPos = 0;
1077 bool insert = false;
1078 bool valid = false;
1079 };
1080
1085 void HandleSoftLineBreaks_Code(SoftBreakCandidate &candidate, wxCoord &lineWidth,
1086 wxCoord tokenWidth, wxCoord &indentationPixels) const;
1087
1095 wxCoord SnippetWidth(const StyledText &snippet, size_t length) const;
1097 wxCoord SnippetWidth(const StyledText &snippet) const {
1098 return SnippetWidth(snippet, snippet.GetText().Length());
1099 }
1101 void DrawSnippetText(wxDC *dc, const StyledText &snippet, wxCoord x,
1102 wxCoord y) const;
1109 wxCoord DigitGapsWidthIn(size_t from, size_t to) const;
1110
1118 static bool BreakAfterOperator(const wxString &token, const wxString &prevToken,
1119 const wxString &nextToken);
1120
1127 bool IsSoftBreakBefore(std::size_t pos) const {
1128 return std::ranges::binary_search(m_softBreaks, pos);
1129 }
1130
1136 size_t GetIndentDepth(wxString text, size_t positionOfCaret) const;
1137
1144 static wxString InterpretEscapeString(const wxString &txt);
1145
1147 void MarkSelection(wxDC *dc, size_t start, size_t end, TextStyle style);
1148
1150 wxSize GetTextSize(const wxString &text, TextFormat::Format format) const;
1154 wxCoord MeasureTextWidth(wxCoord startX, const wxString &text,
1155 std::size_t startPos) const;
1157 void SyncFormats() const;
1158
1171 struct LineSlot {
1174 wxCoord top = 0;
1176 wxCoord above = 0;
1178 wxCoord below = 0;
1179 };
1181 static constexpr double g_superSubscriptScale = 0.65;
1187 static wxCoord BaselineShift(TextFormat::Format format, wxCoord plainAscent);
1190 wxCoord LineTop(size_t line) const;
1192 void LineSlotExtent(size_t line, wxCoord *top, wxCoord *height) const;
1194 size_t LineAt(wxCoord y) const;
1196
1198 History m_history;
1200 void SetState(const History::HistoryEntry &state);
1202 std::vector<StyledText> &GetStyledText();
1203
1204//** Large fields
1205//**
1206 using StringHash = std::unordered_map<wxString, wxSize, wxStringHash>;
1208 mutable StringHash m_widths;
1209
1211 mutable std::vector<wxString> m_wordList;
1212
1214 mutable MaximaTokenizer::TokenList m_tokens;
1216 mutable MaximaTokenizer::TokenList m_tokens_including_hidden;
1217
1220 mutable wxString m_text;
1221protected:
1223 mutable std::vector<StyledText> m_styledText;
1224private:
1225
1241 mutable std::vector<std::size_t> m_softBreaks;
1248 mutable std::vector<std::size_t> m_digitGapPositions;
1249
1256 struct FormatState {
1258 TextFormat::Formats formats;
1260 wxString formatsText;
1264 TextFormat::Format pendingFormat = TextFormat::None;
1265 std::size_t pendingPos = 0;
1266 bool hasPending = false;
1268 std::vector<std::pair<wxString, wxString>> unknownLineAttributes;
1271 std::array<std::optional<wxFont>, TextFormat::FontVariants> fonts;
1273 std::optional<wxFont> fontsBase;
1274 };
1276 mutable std::unique_ptr<FormatState> m_formatState;
1283 mutable std::vector<LineSlot> m_lineSlots;
1285 FormatState &GetFormatState() const;
1286
1288 std::vector<std::pair<std::size_t, std::size_t>> m_diffHighlights;
1292 std::size_t m_diffHighlightsTextLength = 0;
1294 struct ErrorMarks {
1295 std::vector<std::pair<std::size_t, std::size_t>> statements;
1296 std::vector<std::pair<std::size_t, std::size_t>> spots;
1302 wxString text;
1303 };
1305 std::unique_ptr<ErrorMarks> m_errorMarks;
1306
1307//** 8/4 bytes
1308//**
1309 DocumentCellPointers *const m_documentCellPointers = GetDocumentCellPointers();
1310 ViewCellPointers *const m_viewCellPointers = GetViewCellPointers();
1311
1312//** 4 bytes
1313//**
1314 size_t m_errorIndex = 1;
1315 mutable size_t m_numberOfLines = 1;
1316 mutable wxCoord m_charHeight = 12;
1317 long m_paren1 = -1, m_paren2 = -1;
1318
1319//** 2 bytes
1320//**
1321 AFontStyle m_fontStyle;
1322 AFontWeight m_fontWeight;
1323
1324//** Bitfield objects (2 bytes)
1325//**
1327 bool m_autoAnswer : 1 = false;
1329 mutable bool m_containsChanges : 1 = false;
1330 bool m_containsChangesCheck : 1 = false;
1331 bool m_displayCaret : 1 = false;
1332 bool m_hasFocus : 1 = false;
1333 bool m_errorIndexSet : 1 = false;
1335 bool m_selectionChanged : 1 = false;
1337 bool m_underlined : 1 = false;
1339 mutable bool m_tokens_including_hidden_valid : 1 = false;
1341 mutable bool m_tokens_valid : 1 = false;
1343 mutable bool m_containsLinks : 1 = false;
1344 mutable bool m_isDirty : 1 = true;
1345};
1346
1347#endif // EDITORCELL_H
The definition of the base class of all cells the worksheet consists of.
CellType
The supported types of math cells.
Definition: Cell.h:64
This file declares the class Maximatokenizer.
Character formatting (bold, italic, superscript, ...) of the text in a text cell (GH #492).
std::vector< Format > Formats
One Format per character, indexed like the text it belongs to; empty = plain.
Definition: TextFormat.h:111
std::uint8_t Format
The formatting of one character: a combination of the flags below.
Definition: TextFormat.h:68
TextStyle
All text styles known to wxMaxima.
Definition: TextStyle.h:230
int group
Neighbouring sections of the same group aren't separated.
Definition: ToolBarSections.cpp:45
A Type-Safe Fixed-Point Font Size.
Definition: FontAttribs.h:99
A cached integer value.
Definition: CachedValue.h:45
A class that carries information about the type of a cell.
Definition: Cell.h:93
The base class all cell types the worksheet can consist of are derived from.
Definition: Cell.h:148
Cell * GetNext() const
Get the next cell in the list.
Definition: Cell.h:864
Cell * GetPrevious() const
Returns a pointer to the previous cell in the current cell list.
Definition: Cell.h:861
Configuration * m_configuration
A pointer to the configuration responsible for this worksheet.
Definition: Cell.h:1199
DocumentCellPointers * GetDocumentCellPointers() const
The document-model half of the cell-pointer registry this cell uses.
Definition: Cell.cpp:69
virtual void SetCurrentPoint(wxPoint point) const
Pass 2: Arrangement.
Definition: Cell.cpp:526
AFontSize m_fontSize_Scaled
The font size is smaller in super- and subscripts.
Definition: Cell.h:1242
ViewCellPointers * GetViewCellPointers() const
The transient view-state half of the cell-pointer registry this cell uses.
Definition: Cell.cpp:73
bool NeedsRecalculation() const
True, if something that affects the cell size has changed.
Definition: Cell.h:610
const TextStyle & GetTextStyle() const
Get the text style.
Definition: Cell.h:692
The configuration storage for the current worksheet.
Definition: Configuration.h:101
const Style * GetStyle(TextStyle textStyle) const
Get the text Style for a given text style identifier.
Definition: Configuration.h:1270
The document-model half of the cell-pointer registry.
Definition: CellPointers.h:53
How an entry to the undo history looks like.
Definition: EditorCell.h:716
bool SameContent(const HistoryEntry &other) const
Do both entries hold the same text with the same formatting?
Definition: EditorCell.h:727
The undo history of this cell.
Definition: EditorCell.h:706
A piece of styled text for syntax highlighting.
Definition: EditorCell.h:960
void SetDigitGaps(std::vector< size_t > gaps)
See GetDigitGaps()
Definition: EditorCell.h:1041
const wxString & GetText() const
Returns the piece of text.
Definition: EditorCell.h:1002
void SetFormat(TextFormat::Format format)
Sets the character formatting of this text portion.
Definition: EditorCell.h:1026
TextFormat::Format GetFormat() const
The character formatting all of this text portion has.
Definition: EditorCell.h:1024
void SetIndentation(wxCoord indentPixels, const wxString &indentString={})
Changes the indentation level of this token.
Definition: EditorCell.h:1006
void SetLink()
Marks this text portion as a link.
Definition: EditorCell.h:1022
void SetYOffset(wxCoord yOffset)
See m_yOffset.
Definition: EditorCell.h:1030
StyledText(const wxString &text, TextStyle style, wxCoord indentPixels=0, const wxString &indentChar={})
Defines a piece of text with the default style that possibly is indented.
Definition: EditorCell.h:993
const std::vector< size_t > & GetDigitGaps() const
Where this text portion, a number in a code cell, gets the small gaps that separate its digit groups ...
Definition: EditorCell.h:1039
bool IsLink() const
Is this text portion a link? Its text is then the link's address.
Definition: EditorCell.h:1020
TextStyle GetTextStyle() const
If IsStyleSet() is true this function returns the style of this text portion.
Definition: EditorCell.h:1016
StyledText(TextStyle style, const wxString &text)
Defines a piece of styled text.
Definition: EditorCell.h:989
wxCoord GetIndentPixels() const
By how many pixels do we need to indent this line due to a bullet list or similar?
Definition: EditorCell.h:1012
wxCoord GetYOffset() const
See m_yOffset.
Definition: EditorCell.h:1028
void SetText(const wxString &text)
Changes the piece of text kept in this token.
Definition: EditorCell.h:1004
This class defines what the user sees as input cell.
Definition: EditorCell.h:67
const MaximaTokenizer::TokenList & GetAllTokens() const
Get the list of commands, parenthesis, strings and whitespaces in a code cell.
Definition: EditorCell.cpp:4956
void SetValue(const wxString &text) override
Sets the text that is to be displayed.
Definition: EditorCell.cpp:5052
virtual wxString XMLTypeAttribute() const
The type="..." attribute ToXML() writes for this cell.
Definition: EditorCell.cpp:658
wxPoint LineColumnToPoint(size_t line, size_t column, size_t pos)
PositionToPoint() for a position whose display line and column are already known - or have to be forc...
Definition: EditorCell.cpp:3358
void SetCurrentPoint(wxPoint point) const override
Pass 2: Arrangement.
Definition: EditorCell.cpp:1041
size_t ReplaceAll(wxString oldString, const wxString &newString, bool ignoreCase)
Replaces all occurrences of a given string.
Definition: EditorCell.cpp:5082
const wxFont & GetFont() const
Get the font that matches this cell's formatting.
Definition: EditorCell.h:211
virtual wxString PreprocessNewValue(const wxString &text, std::size_t &cursorPos) const
Transform text on its way into SetValue(); returns what to store and sets cursorPos.
Definition: EditorCell.cpp:5009
wxCoord NextTabStop(wxCoord startX) const
Pixel x of the next 4-column tab stop at or after startX, where one column is the width of a space gl...
Definition: EditorCell.cpp:1883
void CaretToStart()
Move the cursor to the start of this cell.
Definition: EditorCell.cpp:5516
wxString GetLinkAt(wxPoint point) override
The address of the link drawn at the screen coordinate point, if any.
Definition: EditorCell.cpp:1332
bool InsertHTML(const wxString &html, wxString plainText=wxEmptyString)
Insert HTML another program put on the clipboard, formatting included.
Definition: EditorCell.cpp:1589
bool IsActive() const override
Is this editor cell focused?
Definition: EditorCell.cpp:4269
size_t XYToPosition(size_t x, size_t y)
Determines which index the char at the position "x chars left, y chars down" is at.
Definition: EditorCell.cpp:3313
std::unique_ptr< Cell > Copy(GroupCell *group) const override
Create a copy of this cell.
size_t GetSelectionStart() const
Get the character position the selection has been started with.
Definition: EditorCell.h:509
void ContainsChanges(bool changes)
Set the information if this cell needs to be re-evaluated by maxima.
Definition: EditorCell.h:770
wxString ToXML() const override
Convert the current cell to XML code for inclusion in a .wxmx file.
Definition: EditorCell.cpp:632
void DeactivateCursor()
Deactivate the blinking cursor in the EditorCell it is in.
Definition: EditorCell.cpp:3183
void StyleTextCode() const
Is Called by StyleText() if this is a code cell.
Definition: EditorCell.cpp:4384
void SetDiffHighlights(std::vector< std::pair< std::size_t, std::size_t > > ranges)
Sets the character ranges of this cell's text the diff viewer wants painted with the TS_DIFF_CHANGED ...
Definition: EditorCell.h:363
void CaretToEnd()
Move the cursor to the end of this cell.
Definition: EditorCell.cpp:5510
const TextFormat::Formats & GetFormats() const
The formats of GetValue(), one per character; empty if it is plain.
Definition: EditorCell.cpp:1506
wxString SelectionToHTML() const
The selected text as a whole HTML document, for other programs.
Definition: EditorCell.cpp:1730
size_t GetCaretPosition() const
Get the cursor's current position inside the cell.
Definition: EditorCell.h:843
wxPoint SelectionLineSpan(size_t lineStart, size_t lineEnd, wxCoord *width)
Where the selection rectangle for [lineStart, lineEnd) goes.
Definition: EditorCell.cpp:933
bool ToggleFormat(TextFormat::Format flag)
Switch a format on or off, as the toolbar's buttons do.
Definition: EditorCell.cpp:1765
bool CopyToClipboard() const override
Copy this cell's editable contents to the clipboard.
Definition: EditorCell.cpp:3735
wxString ToRTF() const override
Convert the current cell to RTF code.
Definition: EditorCell.cpp:457
void ClearErrorIndex()
Clears the index the error is at.
Definition: EditorCell.h:833
wxCoord DigitGroupGapWidth() const
The width of one digit-group gap in a number (GH #192)
Definition: EditorCell.cpp:1943
wxString DivideAtCaret()
DivideAtCaret Returns the string from caret to end and modifies the m_text so it contains only the st...
Definition: EditorCell.cpp:3601
wxString ToString() const override
Returns the cell's representation as a string.
Definition: EditorCell.cpp:378
size_t BeginningOfLine(size_t pos) const
Return the index of the 1st char of the line containing the letter pos.
Definition: EditorCell.cpp:2001
static wxDataFormat FormattedTextDataFormat()
The private clipboard format SelectionToXML()'s result travels in.
Definition: EditorCell.cpp:1742
std::vector< StyledText > m_styledText
The styled-run rendering representation of m_text; see StyledText.
Definition: EditorCell.h:1223
std::vector< wxCoord > RightToLeftLineOffsets()
How far each line has to move right to sit flush with the widest one.
Definition: EditorCell.cpp:3903
wxString GetCurrentCommand() const
Get the command the cursor is in the arguments for.
Definition: EditorCell.cpp:1812
void SetUnknownLineAttributes(std::vector< std::pair< wxString, wxString > > attributes)
The attributes of the <line> elements of a loaded file this version doesn't understand,...
Definition: EditorCell.cpp:1531
bool IsDirty() const override
true, if this cell's width has to be recalculated.
Definition: EditorCell.h:657
void ProcessEvent(wxKeyEvent &event) override
Decide what to do if the user pressed a key when this cell was selected.
Definition: EditorCell.cpp:2093
wxCoord MeasureTextWidth(wxCoord startX, const wxString &text) const
Width, in pixels, of text when it starts at horizontal position startX on its line – like GetTextSize...
Definition: EditorCell.cpp:1890
virtual bool IsCodeEditor() const
Does this concrete cell edit code (Maxima input) rather than prose?
Definition: EditorCell.h:106
const std::vector< std::pair< std::size_t, std::size_t > > & GetErrorSpots() const
The spots AddErrorSpot() has marked (for tests and inspection).
Definition: EditorCell.cpp:5048
bool CanRedo() const
True, if a redo can be done for this cell.
Definition: EditorCell.h:699
wxString GetSelectionString() const
Convert the current selection to a string.
Definition: EditorCell.cpp:5419
long GetSelectionEnd() const
Get the character position the selection has been ended with.
Definition: EditorCell.h:513
void Redo()
Issu a redo command.
Definition: EditorCell.cpp:4288
void SetCaretPosition(size_t pos)
Set the cursor's current position inside the cell.
Definition: EditorCell.h:850
size_t EndOfLine(size_t pos)
Return the index of the last char of the line containing the letter #pos,.
Definition: EditorCell.cpp:2023
void SearchStartedHere() const
Remember that this is the cell the search was started in.
Definition: EditorCell.cpp:299
bool CaretAtStart() const
Is the cursor at the start of this cell?
Definition: EditorCell.h:676
virtual void StyleTypedText() const
The code-vs-prose-specific half of StyleText(), chosen by the subclass.
Definition: EditorCell.cpp:5007
wxSize GetTextSize(const wxString &text) const
Determines the size of a text snippet.
Definition: EditorCell.cpp:1372
void KeyboardSelectionStartedHere() const
Remember that this is the cell the keyboard selection was started in.
Definition: EditorCell.cpp:308
static wxString NormalizeLineEndings(const wxString &input_)
Normalize line endings.
Definition: EditorCell.cpp:1877
bool ReplaceSelection(const wxString &oldStr, const wxString &newString, bool keepSelected=false, bool ignoreCase=false, bool replaceMaximaString=false)
Replace the current selection with a string.
Definition: EditorCell.cpp:5327
void SwitchCaretDisplay() override
Toggles the visibility of the cursor which is used to make it blink.
Definition: EditorCell.h:663
wxString SelectWordUnderCaret(bool selectParens=true, bool toRight=true, bool includeDoubleQuotes=false)
Selects the word the cursor is currently at.
Definition: EditorCell.cpp:3701
wxString ToTeX() const override
Convert the current cell to LaTeX code.
Definition: EditorCell.cpp:491
wxString FormattedHTML(size_t start, size_t end) const
[start, end) of the text as HTML, with its formatting.
Definition: EditorCell.cpp:1716
wxString SelectionToRTF() const
The selected text as a whole RTF document, for other programs.
Definition: EditorCell.cpp:1720
bool CanFormat() const
Can this cell's text be formatted at all? (Not if it is code.)
Definition: EditorCell.h:252
const wxString & GetValue() const override
Returns the text contained in this cell.
Definition: EditorCell.h:237
static bool IsStrongLeftToRight(wxUniChar c)
Is this character a strong left-to-right one?
Definition: EditorCell.cpp:3978
void CopyFormatsFrom(const EditorCell &source)
Take over another cell's formatting, for a cell that took over its text.
Definition: EditorCell.cpp:1538
const std::vector< std::pair< std::size_t, std::size_t > > & GetDiffHighlights() const
The ranges set by SetDiffHighlights() (empty outside the diff viewer).
Definition: EditorCell.h:368
void SelectAll() override
Select the whole text contained in this Cell.
Definition: EditorCell.h:517
void ClearErrorMarks()
Drops all marks AddErrorStatement() and AddErrorSpot() have set.
Definition: EditorCell.cpp:5040
void ReturnToSelectionFromBot()
Return to the selection after the cell has been left downwards.
Definition: EditorCell.h:873
bool CanCopy() const override
Select Can we copy the editable text of this cell?
Definition: EditorCell.h:535
void SelectNone()
Unselect everything.
Definition: EditorCell.h:529
bool FindMatchingQuotes()
For a given quotation mark ("), find a matching quote.
Definition: EditorCell.cpp:3074
void AddDrawParameter(wxString param)
Add a new parameter to a draw- or similar command including the comma, if needed.
Definition: EditorCell.cpp:217
void AutoAnswer(bool autoAnswer)
May this Editor Cell contain the answer to a question?
Definition: EditorCell.h:152
void StyleText() const
Converts m_text to a list of styled text snippets that will later be displayed by draw().
Definition: EditorCell.cpp:4975
bool MixedDirectionOffset(size_t line, size_t position, wxCoord *offset)
Where position sits, in pixels from the line's own left edge, found via the real bidi algorithm (GetL...
Definition: EditorCell.cpp:4052
wxString GetWordUnderCaret()
The word the cursor currently is at.
Definition: EditorCell.cpp:3662
const CellTypeInfo & GetInfo() override
Returns the information about this cell's type.
std::pair< long, long > GetMatchingParens() const
The pair of brackets or quotes FindMatchingParens() found to highlight.
Definition: EditorCell.h:549
wxString GetFullCommandUnderCursor()
Get the whole maxima command that is currently under the cursor (including all arguments)
Definition: EditorCell.cpp:312
wxPoint PositionToPoint() override
Locates the cursor in the editable text of this cell.
Definition: EditorCell.h:479
wxString SelectionToXML() const
The selected text with its formatting, for the clipboard.
Definition: EditorCell.cpp:1550
bool GetLineBidiRuns(size_t line, std::vector< BidiRun > *runs)
Bidi::GetRuns() for a display line, as absolute positions into m_text (Bidi::GetRuns() itself only kn...
Definition: EditorCell.cpp:4031
void SelectRectText(wxPoint one, wxPoint two) override
Selects the text between the screen coordinates one and two.
Definition: EditorCell.cpp:3536
void SetErrorIndex(size_t index)
Sets the index the error is at.
Definition: EditorCell.h:831
size_t LineLength(size_t line)
How many characters the given display line holds, excluding its newline.
Definition: EditorCell.cpp:4001
bool AllSelected() const
Does the selection currently span the whole cell?
Definition: EditorCell.h:523
bool InsertXML(const wxString &xml)
Insert what SelectionToXML() made, formatting included.
Definition: EditorCell.cpp:1564
wxCoord RightToLeftLineOffset(size_t line)
RightToLeftLineOffsets() for a single line, 0 when there is none.
Definition: EditorCell.cpp:3955
TextStyle GetSelectionStyle() const
Try to determine the selection's text style.
Definition: EditorCell.cpp:5424
void SaveValue(History::Action action=History::Action::any)
Save the current contents of this cell in the undo buffer.
Definition: EditorCell.cpp:4299
bool ErrorMarksValid() const
True if there are error marks that still match the text.
Definition: EditorCell.h:396
void PositionToXY(size_t position, size_t *x, size_t *y)
Determines which line and column the pos'th char is at.
Definition: EditorCell.cpp:3284
bool IsPointInSelection(wxPoint point)
Is the point point inside the currently selected text?
Definition: EditorCell.cpp:3547
void PasteFromClipboard(bool primary=false) override
Paste from the clipboard into this cell.
Definition: EditorCell.cpp:3851
void Undo()
Issue an undo command.
Definition: EditorCell.cpp:4273
void AddErrorSpot(std::size_t start, std::size_t end)
Marks the place in a failing statement Maxima's syntax error points at.
Definition: EditorCell.cpp:5030
void SetFont(wxDC *dc) const
Set the currently used font to the one that matches this cell's formatting.
Definition: EditorCell.cpp:1364
wxString ToMatlab() const override
Convert this cell to its Matlab representation.
Definition: EditorCell.cpp:404
bool LineIsRightToLeft(size_t line)
Is the given display line written right to left?
Definition: EditorCell.cpp:3985
bool CutToClipboard() override
Cut this cell's editable contents to the clipboard.
Definition: EditorCell.cpp:3804
EditorCell * GetPrevious() const
Get the previous EditorCell in the list.
Definition: EditorCell.h:135
static bool IsCodeType(CellType type)
Is type a code (Maxima-input) cell type, as opposed to text/sectioning?
Definition: EditorCell.cpp:205
bool CanUndo() const
True, if there is undo information for this cell.
Definition: EditorCell.h:693
bool ActivateCursor()
Activate the blinking cursor in this cell.
Definition: EditorCell.cpp:3193
void SetStyle(TextStyle style) override
Sets the TextStyle of this cell.
Definition: EditorCell.cpp:1359
void InsertEscCommand(const wxString &txt)
Insert the symbol that corresponds to the ESC command txt.
Definition: EditorCell.h:141
bool FindNext(wxString str, const bool &down, const bool &ignoreCase)
Finds the next occurrences of a string.
Definition: EditorCell.cpp:5158
void CaretToPosition(size_t pos)
Move the cursor to a certain position in the cell.
Definition: EditorCell.cpp:5522
bool ContainsChanges() const
Query if this cell needs to be re-evaluated by maxima.
Definition: EditorCell.h:766
EditorCell * GetNext() const
Get the next EditorCell in the list.
Definition: EditorCell.h:138
const std::vector< std::pair< std::size_t, std::size_t > > & GetErrorStatements() const
The statements AddErrorStatement() has marked (for tests and inspection).
Definition: EditorCell.cpp:5043
bool AddEnding() override
Adds a ";" to the end of the last command in this cell in case that it doesn't end in $ or ;.
Definition: EditorCell.cpp:3225
void SetForeground(wxDC *dc)
Sets the current color to this cell's foreground color.
Definition: EditorCell.cpp:1808
bool CaretAtEnd() const
Is the cursor at the end of this cell?
Definition: EditorCell.h:683
void SelectPointText(wxPoint point) override
Sets the cursor to the screen coordinate point.
Definition: EditorCell.cpp:3395
virtual void Draw(wxDC *dc, wxDC *antialiassingDC) override
Pass 3 (Paint): Renders the cell using pre-calculated coordinates.
Definition: EditorCell.cpp:1104
const std::vector< std::size_t > & GetSoftBreaks() const
The soft (word-wrap) line-break offsets of the last styling pass.
Definition: EditorCell.h:351
const auto & GetWordList() const
A list of words that might be applicable to the autocomplete function.
Definition: EditorCell.h:167
void Recalculate(const AFontSize fontsize) const override
Recalculate the size of the cell and the difference between top and center.
Definition: EditorCell.cpp:727
void SetFormats(TextFormat::Formats formats)
Replace the formats; one per character of GetValue(), or empty.
Definition: EditorCell.cpp:1514
void MouseSelectionStartedHere() const
Remember that this is the cell the mouse selection was started in.
Definition: EditorCell.cpp:304
void AddErrorStatement(std::size_t start, std::size_t end)
Marks a statement Maxima reported an error for (GH #289)
Definition: EditorCell.cpp:5019
wxString ToHTML() const
Convert the current cell to HTML code.
Definition: EditorCell.cpp:886
bool LineIsMixedDirection(size_t line)
Does this line mix strong characters of both directions?
Definition: EditorCell.cpp:4016
static std::unique_ptr< EditorCell > Create(GroupCell *group, Configuration *config, CellType type, wxString text={})
Construct the EditorCell subtype (code vs.
Definition: EditorCell.cpp:209
static bool IsStrongRightToLeft(wxUniChar c)
Is this character a strong right-to-left one (Hebrew, Arabic, Farsi, ...)?
Definition: EditorCell.cpp:3962
void ProcessNewline(bool keepCursorAtStartOfLine=true)
Start a new line and optionally auto-indent it.
Definition: EditorCell.cpp:2264
void ConvertNumToUNicodeChar()
Convert a number to unicode chars.
Definition: EditorCell.cpp:683
static wxString PrependNBSP(wxString input)
Convert all but the first of a row of multiple spaces to non-breakable.
Definition: EditorCell.cpp:346
wxString FormattedRTF(size_t start, size_t end, bool markDown) const
[start, end) of the text as RTF, with its formatting.
Definition: EditorCell.cpp:1712
static wxString EscapeHTMLChars(wxString input)
Escape all chars that cannot be used in HTML otherwise.
Definition: EditorCell.cpp:90
void ReturnToSelectionFromTop()
Return to the selection after the cell has been left upwards.
Definition: EditorCell.h:862
void SetType(CellType type) override
Sets the text style according to the type.
Definition: EditorCell.cpp:1354
bool HasFormat(TextFormat::Format flag) const
Is this format on where the user is?
Definition: EditorCell.cpp:1749
A cell grouping input (and, if there is one, also the output) cell to a foldable item.
Definition: GroupCell.h:88
This class generates a pane containing the last commands that were issued.
Definition: History.h:56
const wxFont & GetFont(AFontSize fontSize) const
Returns the font associated with this style, but with the size fontSize.
Definition: TextStyle.cpp:348
The view/interaction half of the cell-pointer registry.
Definition: CellPointers.h:282
One maximal run of same-direction text within a display line, in visual (left-to-right on screen) ord...
Definition: Bidi.h:47