wxMaxima
Loading...
Searching...
No Matches
Cell.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) 2004-2015 Andrej Vodopivec <andrej.vodopivec@gmail.com>
4// Copyright (C) 2014-2018 Gunter Königsmann <wxMaxima@physikbuch.de>
5// Copyright (C) 2020 Kuba Ober <kuba@bertec.com>
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
29#ifndef CELL_H
30#define CELL_H
31
32#include "../precomp.h"
33#include "CellPtr.h"
34#include "CellIterators.h"
35#include "Configuration.h"
36#include "StringUtils.h"
37#include "TextStyle.h"
38#include "CachedValue.h"
39#include <wx/defs.h>
40#if wxUSE_ACCESSIBILITY
41#include <wx/access.h>
42#endif // wxUSE_ACCESSIBILITY
43#include <algorithm>
44#include <map>
45#include <memory>
46#include <vector>
47#include <type_traits>
50class EditorCell;
51class GroupCell;
52class TextCell;
53class wxXmlNode;
54
55// Forward declarations
56template <typename C, typename std::enable_if<std::is_base_of<Cell, C>::value, bool>::type = true>
57inline auto OnInner(const C *cell);
58template <typename C, typename std::enable_if<std::is_base_of<Cell, C>::value, bool>::type = true>
59inline auto OnInner(C *cell);
60
63enum CellType : int8_t
64{
65 MC_TYPE_DEFAULT,
83};
85std::ostream& operator<<(std::ostream& out, const CellType celltype);
86
87#if wxUSE_ACCESSIBILITY
88class CellAccessible;
89#endif
90
93{
94public:
100 virtual const wxString &GetName() const = 0;
101};
102
146// 120 bytes
147class Cell: public Observed
148{
149#if wxUSE_ACCESSIBILITY
150 friend class CellAccessible;
151#endif
152 friend class CellList;
153
154
155 template <typename C, typename std::enable_if<std::is_base_of<Cell, C>::value, bool>::type>
156 friend inline auto OnInner(const C *cell);
157 template <typename C, typename std::enable_if<std::is_base_of<Cell, C>::value, bool>::type>
158 friend inline auto OnInner(C *cell);
159
160public:
163 // This class can be derived from wxAccessible which has no copy constructor
164 void operator=(const Cell&) = delete;
165 Cell(GroupCell *group, const Cell&) = delete;
166
172 virtual std::unique_ptr<Cell> Copy(GroupCell *group) const = 0;
173
175 virtual const CellTypeInfo &GetInfo() = 0;
176
181 wxCoord Scale_Px(double px) const {return m_configuration->Scale_Px(px);}
186 AFontSize Scale_Px(AFontSize size) const { return m_configuration->Scale_Px(size); }
187
188#if wxUSE_ACCESSIBILITY
189 // The methods whose implementation within Cell should be sufficient are
190 // not virtual. Should that prove not to be the case eventually, they can be
191 // made virtual with due caution.
193 wxAccStatus GetParent (Cell ** parent) const;
195 wxAccStatus GetChild(int childId, Cell **child) const;
197 wxAccStatus HitTest (const wxPoint &pt, int *childId, Cell **child);
198
200 virtual wxAccStatus GetName (int childId, wxString *name) const;
202 virtual wxAccStatus GetDescription(int childId, wxString *description) const;
204 virtual wxAccStatus GetFocus (int *childId, Cell **child) const;
206 virtual wxAccStatus GetDefaultAction(int childId, wxString *actionName) const;
208 virtual wxAccStatus GetLocation (wxRect &rect, int elementId);
210 virtual wxAccStatus GetValue (int childId, wxString *strValue) const;
211 virtual wxAccStatus GetRole (int childId, wxAccRole *role) const;
213 virtual wxAccStatus GetState (int childId, long *state) const;
214#endif
215
216
224 virtual const wxString GetToolTip(wxPoint point) const;
225
233 virtual wxString GetLinkAt(wxPoint point);
234
236 virtual ~Cell();
237
239 unsigned long CellsInListRecursive() const;
240
242 wxRect CropToUpdateRegion(wxRect rect) const;
243
245 bool InUpdateRegion() const;
246
248 void SoftLineBreak(bool breakLine = true) const
249 {
250 bool newBreak = breakLine || m_forceBreakLine;
251 if (m_breakLine != newBreak)
252 {
253 m_breakLine = newBreak;
254 InvalidateListCache();
255 }
256 }
257
262 bool BreakUpCells() const;
263
265 struct WideCell {
266 const Cell *cell;
270 };
271
283 void CollectWideCells(std::vector<WideCell> &wideCells,
284 int clientWidth, int parent = -1) const;
285
287 bool UnBreakUpCells() const;
288
311 void BreakLines_List() const;
312
314 int GetLineIndent() const;
315
317 bool BreakLineHere() const { return m_breakLine || m_forceBreakLine; }
318
320 bool HasHardLineBreak() const { return m_forceBreakLine; }
321
328 virtual bool IsTextContinuation() const { return false; }
329
337 bool IsAtLineBreak() const { return m_atLineBreak; }
338
344 void SetAtLineBreak(bool atLineBreak) const;
345
351 bool IsHiddenMultSign() const;
352
358 bool IsDrawnHidden() const;
359
366 virtual wxCoord GetWidthAtLineBreak() const { return GetWidth(); }
367
372 virtual bool BreakUp() const;
373
374protected:
380 void BreakUpAndMark() const;
381
382protected:
384 wxBitmap BitmapFromSVG(wxString svgData, wxSize size);
385public:
393 bool ContainsRect(const wxRect &sm, bool all = true) const;
394
399 bool ContainsPoint(wxPoint point) const { return GetRect().Contains(point); }
400
406 virtual void ClearCache()
407 {}
408
413 void ClearCacheList();
414
423 virtual void TallyImageLoadFailures(int &WXUNUSED(dataUnavailable),
424 int &WXUNUSED(decodeFailed)) const
425 {}
426
436 void TallyImageLoadFailures_Recursively(int &dataUnavailable,
437 int &decodeFailed) const;
438
442 void TallyImageLoadFailures_RecursivelyList(int &dataUnavailable,
443 int &decodeFailed) const;
447 virtual void SetConfiguration(Configuration *config);
450
451
457 virtual void Draw(wxDC *dc, wxDC *antialiassingDC);
458
464 void DrawList(wxDC *dc, wxDC *adc);
465
473 virtual void DrawBoundingBox(wxDC &WXUNUSED(dc), bool all = false);
474
480 bool DrawThisCell();
481
488 void ForceBreakLine(bool force = true) const
489 {
490 if (m_forceBreakLine != force || m_breakLine != force)
491 {
492 m_forceBreakLine = m_breakLine = force;
493 InvalidateListCache();
494 }
495 }
496
498 wxString GetUUID() const { return m_rareData ? m_rareData->uuid : wxString(); }
500 void SetUUID(const wxString &uuid);
502 void GenerateUUID();
508 bool HasRareCellData() const { return m_rareData != nullptr; }
510 wxString GetExtraXMLAttributes() const;
512 void AddExtraAttribute(const wxString &name, const wxString &value);
513
520 wxCoord GetHeight() const;
521
528 int GetWidth() const;
529
537 wxCoord GetCenter() const;
538
540 bool HasValidSize() const;
542 bool HasStaleSize() const;
544 bool HasValidPosition() const;
545
557 wxCoord GetDrop() const
558 { return GetHeight() - GetCenter(); }
559
564 { return m_type; }
565
572 virtual wxCoord GetMaxDrop() const;
573
580 virtual wxCoord GetCenterList() const;
581
586 virtual wxCoord GetHeightList() const;
587
597 wxCoord SumOfWidths() const;
598
604 wxCoord GetLineWidth() const;
605
610 wxCoord GetCurrentX() const
611 { return m_currentPoint.x; }
612
617 wxCoord GetCurrentY() const
618 { return m_currentPoint.y; }
619
626 virtual wxRect GetRect(bool wholeList = false) const;
627
629 virtual bool NeedsRecalculation(AFontSize fontSize) const;
632
634 void ScheduleRecalculation() const {m_cellCfgCnt_last = m_configuration->CellCfgCnt() - 1 ;}
636 bool ConfigChanged() const {return m_configuration->CellCfgCnt() != m_cellCfgCnt_last;}
643 virtual wxString GetDiffPart() const;
644
652 virtual void Recalculate(AFontSize fontsize) const;
653
664 bool RecalculateList(AFontSize fontsize) const;
665
676 bool RecalculateTracked(AFontSize fontsize) const;
677
687 bool FontSizeMatchesExpectation() const;
688
690 void FontsChangedList();
691
693 void ResetSize_Recursively() const;
694
696 void ResetSize_RecursivelyList() const;
697
699 void ResetSize() const;
700
702 void ResetSizeList() const;
703
705 void SetBigSkip(bool skip) { m_bigSkip = skip; }
707 bool HasBigSkip() const { return m_bigSkip; }
708
710 virtual void SetType(CellType type);
711
713 const TextStyle &GetTextStyle() const
714 { return m_textStyle; }
715
717 // cppcheck-suppress functionStatic
718 // cppcheck-suppress functionConst
719 void SetPen(wxDC *dc, double lineWidth = 1.0) const;
721 void SetBrush(wxDC *dc) const;
730 void DrawAngleBracketsAround(wxDC *dc, wxDC *antialiassingDC, Cell *open,
731 Cell *close, const Cell *contents) const;
732 wxColour GetForegroundColor() const;
733
735 void SetHighlight(bool highlight) { m_highlight = highlight; }
737 bool GetHighlight() const { return m_highlight; }
738
743 virtual void SetIsExponent();
744
749 virtual void SetIsExponentList();
750
755 virtual void SetValue(const wxString &WXUNUSED(text)) {}
757 virtual const wxString &GetValue() const;
758 virtual const wxString GetDisplayedString() const {return GetValue();}
759
761 Cell *first() const;
762
764 Cell *last() const;
765
767 struct Range {
768 Cell *first, *last;
769 };
770
774 Range GetCellsInRect(const wxRect &rect) const;
775
779 Range GetListCellsInRect(const wxRect &rect) const;
780
782 virtual Range GetInnerCellsInRect(const wxRect &rect) const;
783
785 virtual bool IsOperator() const { return false; }
786
788 bool IsCompound() const;
789
791 virtual bool IsShortNum() const { return false; }
792
794 GroupCell *GetGroup() const;
795
798 {
799 public:
800 double x, y;
801 };
802
804 virtual wxString ListToString() const;
805
810 wxString VariablesAndFunctionsList() const;
812 virtual wxString ListToMatlab() const;
814 virtual wxString ListToTeX() const;
816 virtual wxString ListToXML() const;
817
819 virtual wxString ListToMathML(bool startofline = false) const;
820
822 virtual wxString ListToOMML(bool startofline = false) const;
823
825 virtual wxString ListToRTF(bool startofline = false) const;
826
828 virtual wxString ToString() const;
829
835 virtual wxString ToRTF() const
836 { return wxEmptyString; }
837
839 static wxString OMML2RTF(wxXmlNode *node);
840
842 static wxString OMML2RTF(wxString ommltext);
843
853 virtual wxString ToOMML() const;
855 virtual wxString ToMatlab() const;
857 virtual wxString ToTeX() const;
858
867 static wxString TeXGroup(const wxString &tex);
868
876 static bool TeXNeedsGrowingDelimiters(const wxString &tex);
878 virtual wxString ToXML() const;
879 virtual wxString GetXMLFlags() const;
881 virtual wxString ToMathML() const;
882
884 static wxString RTFescape(wxString, bool MarkDown = false);
885
887 static wxString XMLescape(wxString);
888
889 // cppcheck-suppress functionStatic
890 // cppcheck-suppress functionConst
891
899 virtual void Unbreak() const;
900
908 virtual void UnbreakList() const;
909
911 Cell *GetPrevious() const { return m_previous; }
912
914 Cell *GetNext() const { return m_next.get(); }
915
938 virtual size_t GetBrokenCellCount() const { return GetInnerCellCount(); }
940 virtual Cell *GetBrokenCell(size_t index) const { return GetInnerCell(index); }
941
946 bool IsComment() const
947 {
948 return m_type == MC_TYPE_TEXT || m_type == MC_TYPE_SECTION ||
949 m_type == MC_TYPE_SUBSECTION || m_type == MC_TYPE_SUBSUBSECTION ||
950 m_type == MC_TYPE_HEADING5 || m_type == MC_TYPE_HEADING6 || m_type == MC_TYPE_TITLE;
951 }
952
962 bool IsHidden() const { return m_isHidden; }
963
965 virtual bool FirstLineOnlyEditor() const;
966
968 virtual void Hide(bool hide = true) { m_isHidden = hide; }
969
974 bool IsEditable(bool input = false) const
975 {
976 return (m_type == MC_TYPE_INPUT &&
977 m_previous && m_previous->m_type == MC_TYPE_MAIN_PROMPT)
978 || (!input && IsComment());
979 }
980
982 virtual bool CanPopOut() const { return false; }
983
988 virtual wxString GnuplotSource() const {return wxEmptyString;}
989
991 virtual void ProcessEvent(wxKeyEvent &WXUNUSED(event))
992 {}
993
998 virtual bool AddEnding()
999 { return false; }
1000
1002 virtual void SelectPointText(wxPoint point);
1003
1005 virtual void SelectRectText(wxPoint one, wxPoint two);
1006
1013 virtual void PasteFromClipboard(bool primary = false);
1014
1018 virtual bool CopyToClipboard() const
1019 { return false; }
1020
1024 virtual bool CutToClipboard()
1025 { return false; }
1026
1028 virtual void SelectAll()
1029 {}
1030
1032 virtual bool CanCopy() const
1033 { return false; }
1034
1036 virtual wxPoint PositionToPoint(size_t WXUNUSED(pos))
1037 { return wxDefaultPosition; }
1038
1040 virtual wxPoint PositionToPoint()
1041 { return wxDefaultPosition; }
1042
1044 virtual bool IsDirty() const
1045 { return false; }
1046
1047 virtual void SwitchCaretDisplay()
1048 {}
1049
1051 virtual void SetFocus(bool WXUNUSED(focus))
1052 {}
1053
1055 void SetTextColor(wxDC *dc);
1056
1058 virtual bool IsActive() const
1059 { return false; }
1060
1062 virtual void SetStyle(TextStyle style)
1063 {
1065 m_textStyle = style;
1066 }
1068 bool IsMath() const;
1069
1071 virtual int GetImageBorderWidth() const { return 0; }
1072
1074 void CopyCommonData(const Cell & cell);
1075
1077 std::unique_ptr<Cell> CopyList(GroupCell *group) const;
1078
1080 static std::unique_ptr<Cell> CopyList(GroupCell *group, const Cell *cell);
1081
1083 void ClearToolTip();
1085 void SetToolTip(const wxString &tooltip) const ;
1089 void SetToolTip(const wxString *toolTip) const;
1091 void AddToolTip(const wxString &tip);
1092
1105
1114 virtual void SetCurrentPoint(wxPoint point) const;
1115
1119 void SetCurrentPoint(int x, int y) const { SetCurrentPoint({x, y}); }
1120
1127 void SetCurrentPointList(wxPoint point);
1128
1135 void SetCurrentPointDrawList(wxPoint point);
1136
1140 wxPoint GetCurrentPoint() const {return m_currentPoint;}
1142
1149 bool IsBrokenIntoLines() const { return m_isBrokenIntoLines; }
1150
1159 bool GetSuppressMultiplicationDot() const { return m_suppressMultiplicationDot; }
1160 void SetSuppressMultiplicationDot(bool val) { m_suppressMultiplicationDot = val; }
1162 bool GetHidableMultSign() const { return m_isHidableMultSign; }
1163 void SetHidableMultSign(bool val) { m_isHidableMultSign = val; }
1164
1175 virtual void SetAltCopyText(const wxString &text);
1177 virtual const wxString &GetAltCopyText() const { return wxm::emptyString; }
1178
1179#if wxUSE_ACCESSIBILITY
1180 CellAccessible *GetAccessible();
1181#endif
1182#if CELL_TEST
1183 void MockBreakUp() { m_isBrokenIntoLines = 1; }
1184#endif
1185
1186 static wxString wxColor2HtmlString(wxColor col);
1187protected:
1188 std::unique_ptr<Cell> MakeVisiblyInvalidCell() const;
1189public:
1190 static std::unique_ptr<Cell> MakeVisiblyInvalidCell(GroupCell *group, Configuration *config);
1191
1192protected:
1193//** Bases and internal members (16 bytes)
1194//**
1195// VTable *__vtable;
1196// Observed __observed;
1197
1198//** 8-byte objects (8 bytes)
1199//**
1213 mutable wxPoint m_currentPoint{-1, -1};
1214
1215protected:
1216//** 8/4-byte objects (40 + 8* bytes)
1217//**
1218
1219private:
1221 mutable std::atomic<std::int_fast32_t> m_cellCfgCnt_last = { -1 };
1231 mutable std::atomic<std::int_fast32_t> m_listCacheCfgCnt = { -1 };
1233 std::unique_ptr<Cell> m_next;
1234
1236 Cell *m_previous = {};
1237
1238#if wxUSE_ACCESSIBILITY
1239 std::unique_ptr<CellAccessible> m_accessible;
1240#endif
1241
1242public:
1243 const wxString &GetLocalToolTip() const;
1244protected:
1247
1250
1253 mutable const wxString *m_toolTip /* initialized in the constructor */;
1254
1255//** 4-byte objects (28 bytes)
1256//**
1257protected:
1285protected:
1286//** 2-byte objects (2 bytes)
1287//**
1291 mutable AFontSize m_fontSize = {};
1299
1300//** 1-byte objects (2 bytes)
1301//**
1302 // The celltype of this object
1303 CellType m_type = MC_TYPE_DEFAULT;
1304 // The text style of this object
1305 TextStyle m_textStyle = TS_MATH;
1306
1307private:
1308//** Bitfield objects (2 bytes)
1309//**
1317 void UpdateListCaches() const;
1318
1320 mutable bool m_ownsToolTip : 1 = false;
1321 bool m_bigSkip : 1 = false;
1322 mutable bool m_isBrokenIntoLines : 1 = false;
1323 bool m_isHidden : 1 = false;
1324 bool m_isHidableMultSign : 1 = false;
1325 bool m_suppressMultiplicationDot : 1 = false;
1327 mutable bool m_breakLine : 1 = false;
1329 mutable bool m_atLineBreak : 1 = false;
1339 struct RareCellData {
1341 wxString uuid;
1343 std::map<wxString, wxString> extraAttributes;
1344 };
1345 std::unique_ptr<RareCellData> m_rareData;
1347 RareCellData &RareData();
1348protected:
1349 mutable bool m_forceBreakLine : 1 = false;
1350 bool m_highlight : 1 = false;
1351
1352protected:
1353 friend class InnerCellIterator;
1355 virtual size_t GetInnerCellCount() const;
1358 virtual Cell *GetInnerCell(size_t index) const;
1359
1361 virtual void FontsChanged() const
1363
1368
1369 void InvalidateListCache() const;
1370};
1371
1372// The static cast here requires Cell to be defined
1373template <typename T>
1374template <typename PtrT, typename std::enable_if<std::is_pointer<PtrT>::value, bool>::type>
1375inline PtrT CellPtr<T>::CastAs() const noexcept { return dynamic_cast<PtrT>(static_cast<Cell*>(base_get())); }
1376
1377#if wxUSE_ACCESSIBILITY
1378class CellAccessible final : public wxAccessible
1379{
1380public:
1381 explicit CellAccessible(Cell *const forCell) : m_cell(forCell) {}
1382
1384 wxAccStatus GetName (int childId, wxString *name) override;
1386 wxAccStatus GetParent (wxAccessible **parent) override;
1388 wxAccStatus GetChildCount (int *childCount) override;
1390 wxAccStatus GetChild (int childId, wxAccessible **child) override;
1392 wxAccStatus HitTest (const wxPoint &pt,
1393 int *childId, wxAccessible **child) override;
1395 wxAccStatus GetDescription(int childId, wxString *description) override;
1397 wxAccStatus GetDefaultAction(int childId, wxString *actionName) override;
1399 wxAccStatus GetFocus (int *childId, wxAccessible **child) override;
1401 wxAccStatus GetLocation (wxRect &rect, int elementId) override;
1403 wxAccStatus GetValue (int childId, wxString *strValue) override;
1404 wxAccStatus GetRole (int childId, wxAccRole *role) override;
1406 wxAccStatus GetState (int childId, long *state) override;
1407private:
1408 Cell *const m_cell;
1409};
1410#endif
1411
1413template <typename C, typename std::enable_if<std::is_base_of<Cell, C>::value, bool>::type = true>
1414inline auto OnList(const C *cell) { return CellListAdapter<const C>(cell); }
1415template <typename C, typename std::enable_if<std::is_base_of<Cell, C>::value, bool>::type = true>
1416inline auto OnList(C *cell) { return CellListAdapter<C>(cell); }
1417
1419template <typename C, typename std::enable_if<std::is_base_of<Cell, C>::value, bool>::type = true>
1420inline auto OnDrawList(const C *cell) { return CellDrawListAdapter<const C>(cell); }
1421template <typename C, typename std::enable_if<std::is_base_of<Cell, C>::value, bool>::type = true>
1422inline auto OnDrawList(C *cell) { return CellDrawListAdapter<C>(cell); }
1423
1425template <typename C, typename std::enable_if<std::is_base_of<Cell, C>::value, bool>::type>
1426inline auto OnInner(const C *cell) { return InnerCellAdapter(const_cast<Cell *>(cell)); }
1427template <typename C, typename std::enable_if<std::is_base_of<Cell, C>::value, bool>::type>
1428inline auto OnInner(C *cell) { return InnerCellAdapter(cell); }
1429
1430inline size_t InnerCellIterator::GetInnerCellCount(const Cell *cell) { return cell->GetInnerCellCount(); }
1431inline Cell *InnerCellIterator::GetInnerCell(const Cell *cell, size_t index) { return cell->GetInnerCell(index); }
1432
1433#endif // CELL_H
Declares "mostly read-only" wrappers around values that are expensive to compute and are thus cached.
Declares the various iterators useful with the Cell class.
Implementation of an observing weak Cell pointer.
auto OnList(const C *cell)
Returns an iterable the goes over the cell list, starting with given, possibly null,...
Definition: Cell.h:1414
std::ostream & operator<<(std::ostream &out, const CellType celltype)
Allow Standard c++ streams to print out our enum values as text.
Definition: Cell.cpp:2038
auto OnDrawList(const C *cell)
Returns an iterable that goes over the cell draw list, starting with given, possibly null,...
Definition: Cell.h:1420
CellType
The supported types of math cells.
Definition: Cell.h:64
@ MC_TYPE_WARNING
A warning output by maxima.
Definition: Cell.h:70
@ MC_TYPE_PROMPT
Maxima questions or lisp prompts.
Definition: Cell.h:67
@ MC_TYPE_SECTION
A section name.
Definition: Cell.h:78
@ MC_TYPE_ASCIIMATHS
Equations displayed in 2D.
Definition: Cell.h:73
@ MC_TYPE_LABEL
An output label generated by maxima.
Definition: Cell.h:68
@ MC_TYPE_GROUP
A group cells that bundles several individual cells together.
Definition: Cell.h:82
@ MC_TYPE_MAIN_PROMPT
Input labels.
Definition: Cell.h:66
@ MC_TYPE_SUBSECTION
A subsection name.
Definition: Cell.h:74
@ MC_TYPE_INPUT
A cell containing code.
Definition: Cell.h:69
@ MC_TYPE_HEADING5
A subsubsection name.
Definition: Cell.h:76
@ MC_TYPE_TITLE
The title of the document.
Definition: Cell.h:79
@ MC_TYPE_SLIDE
An animation created by the with_slider_* maxima commands.
Definition: Cell.h:81
@ MC_TYPE_SUBSUBSECTION
A subsubsection name.
Definition: Cell.h:75
@ MC_TYPE_HEADING6
A subsubsection name.
Definition: Cell.h:77
@ MC_TYPE_TEXT
Text that isn't passed to maxima.
Definition: Cell.h:72
@ MC_TYPE_IMAGE
An image.
Definition: Cell.h:80
@ MC_TYPE_ERROR
An error output by maxima.
Definition: Cell.h:71
auto OnInner(const C *cell)
Returns an iterable that goes over the inner cells of this cell.
Definition: Cell.h:1426
This file declares everything needed for the text style system used to style all the elements on the ...
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
Definition: diagrams_c.h:5
A cached integer value.
Definition: CachedValue.h:45
Definition: CellIterators.h:174
Definition: CellIterators.h:75
Definition: CellList.h:151
A weak non-owning pointer that becomes null whenever the observed object is destroyed.
Definition: CellPtr.h:539
A class that carries information about the type of a cell.
Definition: Cell.h:93
virtual const wxString & GetName() const =0
The name of the cell type, e.g.
The base class all cell types the worksheet can consist of are derived from.
Definition: Cell.h:148
bool ConfigChanged() const
Has the configuration changed since the last recalculation of this cell?
Definition: Cell.h:636
bool FontSizeMatchesExpectation() const
Does this cell's font size match what its owner last dictated?
Definition: Cell.cpp:584
virtual wxString ToMatlab() const
Convert this cell to its Matlab representation.
Definition: Cell.cpp:1008
virtual const wxString GetToolTip(wxPoint point) const
Returns the ToolTip this cell provides at a given point.
Definition: Cell.cpp:78
bool InUpdateRegion() const
Is this cell inside the region that is currently drawn?
Definition: Cell.cpp:920
virtual void DrawBoundingBox(wxDC &WXUNUSED(dc), bool all=false)
Draw a rectangle that marks this cell or this list of cells as selected.
Definition: Cell.cpp:948
void SetAtLineBreak(bool atLineBreak) const
Tell this cell whether it is directly before or after a soft line break.
Definition: Cell.cpp:778
bool IsBrokenIntoLines() const
Whether this cell is broken into two or more lines.
Definition: Cell.h:1149
void SetPen(wxDC *dc, double lineWidth=1.0) const
Sets the drawing pen to the cell's default foreground color.
Definition: Cell.cpp:1634
void CopyCommonData(const Cell &cell)
Copy common data (used when copying a cell)
Definition: Cell.cpp:214
virtual void PasteFromClipboard(bool primary=false)
Paste from the clipboard into this cell.
Definition: Cell.cpp:1406
bool IsHidden() const
Whether this cell is not to be drawn.
Definition: Cell.h:962
Range GetCellsInRect(const wxRect &rect) const
Returns the first and last cells within the given rectangle, recursing into the inner cells.
Definition: Cell.cpp:1441
virtual size_t GetInnerCellCount() const
The number of inner cells - for use by the iterators.
Definition: Cell.cpp:2029
void ResetSize_RecursivelyList() const
Mark all cached size information of this cell list as "to be calculated".
Definition: Cell.cpp:1496
virtual int GetImageBorderWidth() const
0 for ordinary cells, 1 for slide shows and diagrams displayed with a 1-pixel border
Definition: Cell.h:1071
virtual wxString ToOMML() const
Returns the cell's representation as OMML.
Definition: Cell.cpp:1319
void SetBigSkip(bool skip)
Tell this cell to cause an additional vertical space.
Definition: Cell.h:705
bool IsDrawnHidden() const
Is this cell drawn as empty space on the screen?
Definition: Cell.cpp:798
void TallyImageLoadFailures_Recursively(int &dataUnavailable, int &decodeFailed) const
Recursively visits this cell and everything nested inside it (including an image produced by the very...
Definition: Cell.cpp:1501
bool HasBigSkip() const
Does this cell come with an additional vertical space.
Definition: Cell.h:707
virtual void UnbreakList() const
Unbreak this line.
Definition: Cell.cpp:1589
wxRect CropToUpdateRegion(wxRect rect) const
The part of the rectangle rect that is in the region that is currently drawn.
Definition: Cell.cpp:275
void SoftLineBreak(bool breakLine=true) const
Do we want this cell to start with a linebreak?
Definition: Cell.h:248
CellPtr< GroupCell > m_group
The GroupCell this list of cells belongs to.
Definition: Cell.h:1246
virtual wxString ListToMatlab() const
Convert this list to its LaTeX representation.
Definition: Cell.cpp:1010
virtual wxString ListToOMML(bool startofline=false) const
Convert this list to an OMML representation.
Definition: Cell.cpp:1321
GroupCell * GetGroup() const
Returns the group cell this cell belongs to.
Definition: Cell.cpp:290
bool HasRareCellData() const
Whether this cell carries a UUID or unknown XML attributes.
Definition: Cell.h:508
virtual bool IsActive() const
Is this editor cell focused?
Definition: Cell.h:1058
Configuration * GetConfiguration()
Which configuration object is responsible for this cell?
Definition: Cell.h:449
virtual wxString ListToString() const
Returns this cell list's representation as a string.
Definition: Cell.cpp:978
void BreakUpAndMark() const
Break up the internal cells of this cell, and mark it as broken up.
Definition: Cell.cpp:1567
void ForceBreakLine(bool force=true) const
Insert (or remove) a forced linebreak at the beginning of this cell.
Definition: Cell.h:488
virtual wxRect GetRect(bool wholeList=false) const
Get the smallest rectangle this cell fits in.
Definition: Cell.cpp:911
void AddExtraAttribute(const wxString &name, const wxString &value)
Adds an extra XML attribute to this cell.
Definition: Cell.cpp:2088
virtual wxCoord GetHeightList() const
Returns the total height of this line.
Definition: Cell.cpp:407
virtual void FontsChanged() const
To be called if the font has changed.
Definition: Cell.h:1361
virtual wxCoord GetCenterList() const
Returns the maximum distance between top and center of this line.
Definition: Cell.cpp:397
AFontSize m_fontSize_expected
The font size this cell's owner last dictated (via RecalculateTracked()).
Definition: Cell.h:1298
void ClearToolTip()
Remove this cell's tooltip.
Definition: Cell.cpp:474
wxString GetUUID() const
Returns the UUID of this cell.
Definition: Cell.h:498
virtual wxString GetLinkAt(wxPoint point)
The address of the link drawn at the screen coordinate point, if any (GH #2396).
Definition: Cell.cpp:92
wxCoord GetHeight() const
Get the height of this cell.
Definition: Cell.cpp:298
Cell * GetNext() const
Get the next cell in the list.
Definition: Cell.h:914
virtual void SelectAll()
Select all editable text of this cell.
Definition: Cell.h:1028
virtual Cell * GetBrokenCell(size_t index) const
Retrieve a piece of this cell's broken (linear/1D) display; see GetBrokenCellCount().
Definition: Cell.h:940
bool HasValidPosition() const
Has this cell been given a position yet? A negative one counts, too.
Definition: Cell.cpp:648
virtual void Unbreak() const
Undo breaking this cell into multiple lines.
Definition: Cell.cpp:1577
int GetLineIndent() const
If this were the beginning of a line: How far do we need to indent it?
Definition: Cell.cpp:671
void SetCurrentPointList(wxPoint point)
Helper to position a horizontal list of cells.
Definition: Cell.cpp:536
virtual void SetValue(const wxString &WXUNUSED(text))
Allows to change the text a TextCell contains.
Definition: Cell.h:755
wxCoord Scale_Px(double px) const
Scale font sizes and line widths according to the zoom factor.
Definition: Cell.h:181
CachedInteger< wxCoord > m_cachedLineWidth
Cache for GetLineWidth(): the width of only the first display line of the list starting at this cell ...
Definition: Cell.h:1284
virtual void TallyImageLoadFailures(int &WXUNUSED(dataUnavailable), int &WXUNUSED(decodeFailed)) const
Blocks until this cell's own image (if any) has finished loading, then adds 1 to dataUnavailable or d...
Definition: Cell.h:423
bool ContainsPoint(wxPoint point) const
Is a given point inside this cell?
Definition: Cell.h:399
virtual bool IsShortNum() const
True if this cell represents a short number.
Definition: Cell.h:791
CellType GetType() const
Returns the type of this cell.
Definition: Cell.h:563
void SetTextColor(wxDC *dc)
Sets the text color.
Definition: Cell.cpp:1649
virtual bool CanCopy() const
Select Can we copy the editable text of this cell?
Definition: Cell.h:1032
virtual wxString ListToMathML(bool startofline=false) const
Convert this list to a MathML representation.
Definition: Cell.cpp:1136
virtual wxString ListToTeX() const
Convert this list to its LaTeX representation.
Definition: Cell.cpp:1104
Cell * GetPrevious() const
Returns a pointer to the previous cell in the current cell list.
Definition: Cell.h:911
virtual const wxString & GetAltCopyText() const
Get the text set using SetAltCopyText - may be empty.
Definition: Cell.h:1177
bool GetHidableMultSign() const
Whether this is a hidable multiplication sign.
Definition: Cell.h:1162
bool HasHardLineBreak() const
Does this cell begin with a manual linebreak?
Definition: Cell.h:320
unsigned long CellsInListRecursive() const
How many cells does this cell contain?
Definition: Cell.cpp:263
virtual bool FirstLineOnlyEditor() const
True, if this GroupCell is folded and its editor shows only its first line.
Definition: Cell.cpp:196
bool IsAtLineBreak() const
Is this cell directly before or after a line break BreakLines_List() added?
Definition: Cell.h:337
virtual wxString ToString() const
Returns the cell's representation as a string.
Definition: Cell.cpp:962
void SetConfigurationList(Configuration *config)
Tell this cell list to use the configuration object config.
Definition: Cell.cpp:660
void AddToolTip(const wxString &tip)
Add another tooltip to this cell.
Definition: Cell.cpp:501
Cell * last() const
Get the last cell in this list of cells.
Definition: Cell.cpp:1556
virtual void ClearCache()
Clears memory from cached items automatically regenerated when the cell is drawn.
Definition: Cell.h:406
bool GetSuppressMultiplicationDot() const
Do we want to begin this cell with a center dot if it is part of a product?
Definition: Cell.h:1159
virtual wxString ListToRTF(bool startofline=false) const
Convert this list to an RTF representation.
Definition: Cell.cpp:1350
virtual void SetIsExponent()
Tell this cell to be an exponent.
Definition: Cell.cpp:526
bool GetHighlight() const
Is this cell highlighted (e.G. inside a maxima box)
Definition: Cell.h:737
static wxString RTFescape(wxString, bool MarkDown=false)
Escape a string for RTF.
Definition: Cell.cpp:1273
bool HasStaleSize() const
Is the size valid, whether a recalculation is pending or not?
Definition: Cell.cpp:644
void SetHighlight(bool highlight)
Mark this cell as highlighted (e.G. being in a maxima box)
Definition: Cell.h:735
bool HasValidSize() const
Is the size valid and not pending a recalculation?
Definition: Cell.cpp:640
virtual size_t GetBrokenCellCount() const
The number of pieces this cell is displayed as once it IsBrokenIntoLines(), and in what order – see G...
Definition: Cell.h:938
bool IsEditable(bool input=false) const
Is this cell editable?
Definition: Cell.h:974
wxCoord GetCurrentY() const
Get the y position of the top left of this cell.
Definition: Cell.h:617
virtual void SetIsExponentList()
Tell this list of cells to be an exponent.
Definition: Cell.cpp:520
virtual wxString ListToXML() const
Convert this list to a representation fit for saving in a .wxmx file.
Definition: Cell.cpp:1408
bool BreakLineHere() const
Are we allowed to break a line here?
Definition: Cell.h:317
void ResetSizeList() const
Mark the cached height information of the whole list of cells as "to be calculated".
Definition: Cell.cpp:599
virtual wxString GetDiffPart() const
Get the part for diff tag support.
Definition: Cell.cpp:1433
Range GetListCellsInRect(const wxRect &rect) const
Returns the first and last cells within the given rectangle, without recursing into the inner cells.
Definition: Cell.cpp:1448
static wxString TeXGroup(const wxString &tex)
Makes a piece of LaTeX usable as the base or the argument of ^ or _.
Definition: Cell.cpp:1043
wxCoord GetCenter() const
Get the distance between the top and the center of this cell.
Definition: Cell.cpp:318
CachedInteger< wxCoord > m_cachedMaxDrop
Cache for GetMaxDrop(): the largest drop (height below the center) of the cells on the first display ...
Definition: Cell.h:1278
void SetCurrentPoint(int x, int y) const
Sets the position for the cell and convenience overload.
Definition: Cell.h:1119
void BreakLines_List() const
Break lines in this list of cells.
Definition: Cell.cpp:681
wxPoint m_currentPoint
The point in the work sheet at which this cell begins.
Definition: Cell.h:1213
AFontSize m_fontSize
The unscaled font size.
Definition: Cell.h:1291
bool DrawThisCell()
Is this cell currently visible in the window?
Definition: Cell.cpp:626
void ClearCacheList()
Clears the cache of the whole list of cells starting with this one.
Definition: Cell.cpp:258
virtual void Hide(bool hide=true)
Hide this cell. See IsHidden() for details.
Definition: Cell.h:968
virtual void SelectPointText(wxPoint point)
Select the text at point.
Definition: Cell.cpp:1402
void DrawList(wxDC *dc, wxDC *adc)
Helper to draw a list of cells.
Definition: Cell.cpp:550
virtual wxString ToXML() const
Convert this cell to a representation fit for saving in a .wxmx file.
Definition: Cell.cpp:1117
static bool TeXNeedsGrowingDelimiters(const wxString &tex)
Whether delimiters around this LaTeX need to grow with their contents.
Definition: Cell.cpp:1094
void CollectWideCells(std::vector< WideCell > &wideCells, int clientWidth, int parent=-1) const
Recursively collect all cells that are too wide to fit the line.
Definition: Cell.cpp:871
void SetUUID(const wxString &uuid)
Sets the UUID of this cell.
Definition: Cell.cpp:2092
virtual void SetAltCopyText(const wxString &text)
What should end up if placing this cell on the clipboard?
Definition: Cell.cpp:513
virtual void SelectRectText(wxPoint one, wxPoint two)
Select the text between the two points.
Definition: Cell.cpp:1404
virtual wxString ToMathML() const
Convert this cell to a representation fit for saving in a .wxmx file.
Definition: Cell.cpp:1134
CachedInteger< wxCoord > m_height
The height of this cell.
Definition: Cell.h:1262
bool ContainsRect(const wxRect &sm, bool all=true) const
Is a part of this cell inside a certain rectangle?
Definition: Cell.cpp:1473
wxCoord SumOfWidths() const
How many pixels is this list of cells wide, if we don't break it into lines?
Definition: Cell.cpp:409
wxString VariablesAndFunctionsList() const
Returns all variable and function names used inside this list of cells.
Definition: Cell.cpp:966
virtual ~Cell()
Delete this list of cells.
Definition: Cell.cpp:120
AFontSize Scale_Px(AFontSize size) const
Scale font sizes and line widths according to the zoom factor.
Definition: Cell.h:186
virtual bool IsTextContinuation() const
Does this cell continue the line of text the cell before it holds?
Definition: Cell.h:328
virtual void SetStyle(TextStyle style)
Sets the TextStyle of this cell.
Definition: Cell.h:1062
virtual const CellTypeInfo & GetInfo()=0
Returns the information about this cell's type.
virtual std::unique_ptr< Cell > Copy(GroupCell *group) const =0
Create a copy of this cell.
void ScheduleRecalculation() const
Cause this cell to be recalculated the next time.
Definition: Cell.h:634
wxCoord GetLineWidth() const
How many pixels is the current line of this list of cells wide?
Definition: Cell.cpp:416
virtual wxPoint PositionToPoint()
Locates the cursor in the editable text of this cell.
Definition: Cell.h:1040
void SetToolTip(const wxString &tooltip) const
Set the tooltip to a given string.
Definition: Cell.cpp:481
virtual void SetConfiguration(Configuration *config)
Tell this cell to use the configuration object config.
Definition: Cell.cpp:665
virtual wxString GnuplotSource() const
Retrieve the gnuplot source data for this image.
Definition: Cell.h:988
virtual wxCoord GetMaxDrop() const
Returns the maximum distance between center and bottom of this line.
Definition: Cell.cpp:402
static wxString XMLescape(wxString)
Escape a string for XML.
Definition: Cell.cpp:1254
virtual void Draw(wxDC *dc, wxDC *antialiassingDC)
Pass 3 (Paint): Renders the cell using pre-calculated coordinates.
Definition: Cell.cpp:432
virtual Cell * GetInnerCell(size_t index) const
Retrieve an inner cell with given index which must be less than GetInnerCellCount.
Definition: Cell.cpp:2031
virtual const wxString & GetValue() const
Gets the text this text cell contains.
Definition: Cell.cpp:1647
Configuration * m_configuration
A pointer to the configuration responsible for this worksheet.
Definition: Cell.h:1249
int GetWidth() const
Get the width of this cell.
Definition: Cell.cpp:308
virtual wxString ToTeX() const
Convert this cell to its LaTeX representation.
Definition: Cell.cpp:1041
void ResetSize() const
Mark the cached height and width information as "to be calculated".
Definition: Cell.cpp:1515
void GenerateUUID()
Generates a new UUID for this cell.
Definition: Cell.cpp:2064
wxPoint GetCurrentPoint() const
Returns the pre-calculated worksheet position of the cell.
Definition: Cell.h:1140
virtual void SetFocus(bool WXUNUSED(focus))
Focus this editor cell.
Definition: Cell.h:1051
wxString GetExtraXMLAttributes() const
Returns a string containing all extra XML attributes.
Definition: Cell.cpp:2075
DocumentCellPointers * GetDocumentCellPointers() const
The document-model half of the cell-pointer registry this cell uses.
Definition: Cell.cpp:70
virtual void ProcessEvent(wxKeyEvent &WXUNUSED(event))
Processes a key event.
Definition: Cell.h:991
void SetCurrentPointDrawList(wxPoint point)
Helper to position a list of cells using the draw-list logic.
Definition: Cell.cpp:543
virtual void SetCurrentPoint(wxPoint point) const
Pass 2: Arrangement.
Definition: Cell.cpp:532
void TallyImageLoadFailures_RecursivelyList(int &dataUnavailable, int &decodeFailed) const
Same as TallyImageLoadFailures_Recursively(), but for the whole list of cells starting with this one.
Definition: Cell.cpp:1509
wxCoord GetCurrentX() const
Get the x position of the top left of this cell.
Definition: Cell.h:610
virtual wxCoord GetWidthAtLineBreak() const
The width this cell would have if it were at a line break.
Definition: Cell.h:366
bool IsComment() const
Determine if this cell contains text that isn't code.
Definition: Cell.h:946
bool BreakUpCells() const
Cell list: Convert 2d math objects bigger than the screen width into linear form.
Definition: Cell.cpp:802
static wxString OMML2RTF(wxXmlNode *node)
Converts an OMML tag to the corresponding RTF snippet.
Definition: Cell.cpp:1203
bool UnBreakUpCells() const
Convert all maths objects in this call list into their 2D form.
Definition: Cell.cpp:898
virtual void SetType(CellType type)
Sets the text style according to the type.
Definition: Cell.cpp:128
AFontSize m_fontSize_Scaled
The font size is smaller in super- and subscripts.
Definition: Cell.h:1289
virtual Range GetInnerCellsInRect(const wxRect &rect) const
Select the cells inside this cell described by the rectangle rect.
Definition: Cell.cpp:1460
CachedInteger< wxCoord > m_width
The width of this cell; is recalculated by RecalculateHeight.
Definition: Cell.h:1266
ViewCellPointers * GetViewCellPointers() const
The transient view-state half of the cell-pointer registry this cell uses.
Definition: Cell.cpp:74
virtual bool BreakUp() const
Try to split this command into lines to make it fit on the screen.
Definition: Cell.cpp:1565
bool IsCompound() const
Do we have an operator in this line - draw () in frac...
Definition: Cell.cpp:955
wxBitmap BitmapFromSVG(wxString svgData, wxSize size)
Renders a bitmap from svgData at the requested size.
Definition: Cell.cpp:184
void ResetSize_Recursively() const
Mark all cached size information as "to be calculated".
Definition: Cell.cpp:1488
CachedInteger< wxCoord > m_cachedCenterList
Cache for GetCenterList(): the largest center (height above the center) of the cells on the first dis...
Definition: Cell.h:1281
std::unique_ptr< Cell > CopyList(GroupCell *group) const
Return a copy of the list of cells beginning with this one.
Definition: Cell.cpp:238
virtual bool IsDirty() const
Is this cell marked as "from an old maxima run"?
Definition: Cell.h:1044
friend auto OnInner(const C *cell)
Returns an iterable that goes over the inner cells of this cell.
Definition: Cell.h:1426
virtual bool CutToClipboard()
Cut this cell's editable contents to the clipboard.
Definition: Cell.h:1024
virtual bool IsOperator() const
Is this cell an operator?
Definition: Cell.h:785
bool IsMath() const
Is this cell possibly output of maxima?
Definition: Cell.cpp:1678
virtual bool CanPopOut() const
Can this cell be popped out interactively in gnuplot?
Definition: Cell.h:982
wxCoord GetDrop() const
Get the distance between the center and the bottom of this cell.
Definition: Cell.h:557
CachedInteger< wxCoord > m_center
The distance between the top and the insertion point of this cell.
Definition: Cell.h:1272
virtual void Recalculate(AFontSize fontsize) const
Recalculate the size of the cell and the difference between top and center.
Definition: Cell.cpp:608
void FontsChangedList()
Tell a whole list of cells that their fonts have changed.
Definition: Cell.cpp:282
bool NeedsRecalculation() const
True, if something that affects the cell size has changed.
Definition: Cell.h:631
virtual bool AddEnding()
Add a semicolon to a code cell, if needed.
Definition: Cell.h:998
const wxString * m_toolTip
This tooltip is owned by us when m_ownsToolTip is true. Otherwise, it points to a "static" string.
Definition: Cell.h:1253
virtual bool CopyToClipboard() const
Copy this cell's editable contents to the clipboard.
Definition: Cell.h:1018
void SetBrush(wxDC *dc) const
Sets the fill brush to the cell's default foreground color.
Definition: Cell.cpp:1642
bool RecalculateTracked(AFontSize fontsize) const
Recalculate this cell at the font size its owner dictates.
Definition: Cell.cpp:566
bool RecalculateList(AFontSize fontsize) const
Recalculate both width and height of this list of cells.
Definition: Cell.cpp:556
const TextStyle & GetTextStyle() const
Get the text style.
Definition: Cell.h:713
Cell * first() const
Get the first cell in this list of cells.
Definition: Cell.cpp:1547
bool IsHiddenMultSign() const
Is this a multiplication sign the user has chosen to hide?
Definition: Cell.cpp:793
void DrawAngleBracketsAround(wxDC *dc, wxDC *antialiassingDC, Cell *open, Cell *close, const Cell *contents) const
Draws the angle brackets of a matrix power (A^⟨n⟩) around its exponent.
Definition: Cell.cpp:1605
virtual wxString ToRTF() const
Returns the cell's representation as RTF.
Definition: Cell.h:835
virtual wxPoint PositionToPoint(size_t WXUNUSED(pos))
Locates a char in the editable text of this cell.
Definition: Cell.h:1036
The configuration storage for the current worksheet.
Definition: Configuration.h:102
std::int_fast32_t CellCfgCnt() const
A counter that increases every time we need to recalculate all worksheet cells.
Definition: Configuration.h:1621
wxCoord Scale_Px(double px) const
Scales a distance [in pixels] according to the zoom factor.
Definition: Configuration.cpp:1311
The document-model half of the cell-pointer registry.
Definition: CellPointers.h:54
This class defines what the user sees as input cell.
Definition: EditorCell.h:67
A cell grouping input (and, if there is one, also the output) cell to a foldable item.
Definition: GroupCell.h:88
Definition: CellIterators.h:268
Iterates the inner cells of a cell.
Definition: CellIterators.h:192
Objects deriving from this class can be observed by the CellPtr.
Definition: CellPtr.h:97
A Text cell.
Definition: TextCell.h:40
The view/interaction half of the cell-pointer registry.
Definition: CellPointers.h:341
A struct that allows to specify a region of a cell list.
Definition: Cell.h:767
For the bitmap export we sometimes want to know how big the result will be...
Definition: Cell.h:798
A cell CollectWideCells() found too wide, and where it was found.
Definition: Cell.h:265
int parent
Index (in the same vector) of the wide cell this one was found in, or -1 for a cell of the draw list ...
Definition: Cell.h:269
int open(const char *, int)
Opens a file descriptor.
int close(int)
Closes the file descriptor fd.