wxMaxima
Loading...
Searching...
No Matches
Worksheet.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// (C) 2012-2013 Doug Ilijev <doug.ilijev@gmail.com>
5// (C) 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
30#ifndef WORKSHEET_H
31#define WORKSHEET_H
32
33#include <optional>
34#include "precomp.h"
35#include "MaximaManual.h"
36#include "EventIDs.h"
37#include "RecentDocuments.h"
38#include <wx/wx.h>
39#include <wx/xml/xml.h>
40#include <wx/aui/aui.h>
41#include <wx/textfile.h>
42#include <wx/fdrepdlg.h>
43#include <wx/dc.h>
44#include <vector>
45#include <utility>
46#include <memory>
47#include <list>
48#include "CellPointers.h"
50#include "Notification.h"
51#include "cells/Cell.h"
52#include "cells/EditorCell.h"
53#include "cells/ImgCell.h"
54#include "cells/ImgCellBase.h"
55#include "cells/AnimationCell.h"
56#include "cells/GroupCell.h"
57#include "TreeUndoManager.h"
58#include "WorksheetCursor.h"
59#include "WorksheetDocument.h"
61#include "WorksheetSearch.h"
62#include "WorksheetLayout.h"
63#include "cells/TextCell.h"
64#include "EvaluationQueue.h"
66#include "Autocomplete.h"
67#include "AutocompletePopup.h"
69#include "ToolBar.h"
70#include <thread>
71
114class Worksheet : public wxScrolled<wxWindow>, public WorksheetView,
116{
117public:
118 // WorksheetView: the narrow window surface the layout pipeline
119 // (WorksheetLayout) drives; each forwards to the wxScrolled base.
120 void GetViewClientSize(int *width, int *height) const override
121 { GetClientSize(width, height); }
122 int GetViewScrollUnitY() const override
123 { int x, y; GetViewStart(&x, &y); return y; }
124 void SetViewVirtualSize(int width, int height) override
125 { SetVirtualSize(width, height); }
126 void SetViewScrollRate(int rate) override { SetScrollRate(rate, rate); }
127 void GetViewPosition(int *x, int *y) const override
128 { const wxPoint p = GetPosition(); *x = p.x; *y = p.y; }
129
130 // WorksheetDocumentView: how m_document tells this window that a structural
131 // edit happened; each forwards to the real layout/redraw/save machinery.
132 void NotifyRecalculation(GroupCell *start) override
133 { RequestRecalculation(start); }
134 void NotifyRedraw(GroupCell *start) override { RequestRedraw(start); }
135 void NotifyAdjustSizeNeeded() override { m_layout.RequestAdjustSize(); }
136 void NotifySavedStateChanged() override { m_updateControls = true; }
137
139 RecentDocuments &UnsavedDocuments() { return m_unsavedDocuments; }
140private:
141 RecentDocuments m_unsavedDocuments;
142public:
144 bool UpdateControlsNeeded(){bool result = m_updateControls; m_updateControls = false; return result;}
145 void UpdateControlsNeeded(bool updateControlsNeeded){m_updateControls = updateControlsNeeded;}
146private:
148 wxString m_maximaDocDir;
150 bool m_updateControls = true;
152 bool m_scrollToCaret = false;
153 // The x position to scroll to
154 int m_newxPosition = -1;
155 // The y position to scroll to
156 int m_newyPosition = -1;
158 double m_zoomAtGestureStart = 1.0;
160 bool m_scrollToTopOfCell = false;
162 bool m_windowActive = true;
164 wxRegion m_regionToRefresh;
169 wxClientDC m_dc;
171 CellPtr<GroupCell> m_redrawStart;
173 bool m_fullRedrawRequested = false;
175
177 static wxDataFormat m_wxmFormat;
179 static wxDataFormat m_mathmlFormat;
181 static wxDataFormat m_mathmlFormat2;
183 static wxDataFormat m_rtfFormat;
185 static wxDataFormat m_rtfFormat2;
189 static wxDataFormat m_rtfFormat3;
190
193 class MathMLDataObject : public wxCustomDataObject
194 {
195 public:
196 explicit MathMLDataObject(const wxString &data);
197
198 MathMLDataObject();
199
200 private:
201 wxCharBuffer m_databuf;
202 };
203
205 class wxmDataObject : public wxCustomDataObject
206 {
207 public:
208 explicit wxmDataObject(const wxString &data);
209
210 wxmDataObject();
211
212 private:
213 wxCharBuffer m_databuf;
214 };
215
216 class MathMLDataObject2 : public wxCustomDataObject
217 {
218 public:
219 explicit MathMLDataObject2(const wxString &data);
220
221 MathMLDataObject2();
222
223 private:
224 wxCharBuffer m_databuf;
225 };
226
229 class RtfDataObject : public wxCustomDataObject
230 {
231 public:
232 explicit RtfDataObject(const wxString &data);
233
234 RtfDataObject();
235
236 private:
237 wxCharBuffer m_databuf;
238 };
239
240 class RtfDataObject2 : public wxCustomDataObject
241 {
242 public:
243 explicit RtfDataObject2(const wxString &data);
244
245 RtfDataObject2();
246
247 private:
248 wxCharBuffer m_databuf;
249 };
250
253 class RtfDataObject3 : public wxCustomDataObject
254 {
255 public:
256 explicit RtfDataObject3(const wxString &data);
257
258 RtfDataObject3();
259
260 private:
261 wxCharBuffer m_databuf;
262 };
263
265 bool m_hasFocus = true;
267 long m_lastTop = 0;
269 long m_lastBottom = 0;
291 // TreeUndoAction/UndoActions live in TreeUndoAction.h and the undo/redo
292 // state (the two stacks + the active-cell snapshot) is owned by the
293 // TreeUndoManager below; only the tree surgery of applying an action
294 // remains a Worksheet responsibility.
295
296private:
298 TreeUndoManager &GetTreeUndo() { return m_document.GetTreeUndo(); }
299 const TreeUndoManager &GetTreeUndo() const { return m_document.GetTreeUndo(); }
300
301public:
304
307
309 void TreeUndo_AppendAction() { GetTreeUndo().AppendAction(); }
310
316 bool TreeUndo(UndoActions *sourcelist, UndoActions *undoForThisOperation);
317
321 bool TreeUndoTextChange(UndoActions *sourcelist, UndoActions *undoForThisOperation);
325 bool TreeUndoCellDeletion(UndoActions *sourcelist, UndoActions *undoForThisOperation);
329 bool TreeUndoCellAddition(UndoActions *sourcelist, UndoActions *undoForThisOperation);
333 bool TreeUndoFold(UndoActions *sourcelist, UndoActions *undoForThisOperation);
334
336 bool TreeUndo()
337 { return TreeUndo(&GetTreeUndo().UndoStack(), &GetTreeUndo().RedoStack()); }
338
340 bool TreeRedo()
341 { return TreeUndo(&GetTreeUndo().RedoStack(), &GetTreeUndo().UndoStack()); }
342
344 bool CanTreeUndo() const;
345
347 bool CanTreeRedo() const;
348
352
355 void TreeUndo_CellLeft();
356
365 void TreeUndo_MarkCellsAsAdded(GroupCell *start, GroupCell *end, UndoActions *undoBuffer);
366
367
373 void TreeUndo_MarkCellsAsAdded(GroupCell *parentOfStart, GroupCell *end);
375
376private:
377 bool m_scrolledAwayFromEvaluation = false;
378public:
379
382 {
383 CLICK_TYPE_NONE,
384 CLICK_TYPE_GROUP_SELECTION,
385 CLICK_TYPE_INPUT_SELECTION,
386 CLICK_TYPE_INPUT_LABEL_SELECTION,
387 CLICK_TYPE_OUTPUT_SELECTION
388 };
389
392 {
393 TIMER_ID,
394 CARET_TIMER_ID,
395 DISPLAY_TIMEOUT_ID
396 };
397
399 std::unique_ptr<Cell> CopySelection(bool asData = false) const;
400
409 std::unique_ptr<Cell> CopySelection(Cell *start, Cell *end, bool asData = false) const;
410
412 void GetMaxPoint(int *width, int *height) { m_layout.GetMaxPoint(width, height); }
413
415 void OnTimer(wxTimerEvent &event);
416
417#if wxCHECK_VERSION(3, 1, 1)
419 void OnZoom(wxZoomGestureEvent &event);
420#endif
421
422 void OnMouseExit(wxMouseEvent &event);
423
424 void OnMouseEnter(wxMouseEvent &event);
425
438 void OnPaint(wxPaintEvent &event);
440 void DrawGroupCell(wxDC &dc, wxDC &adc, GroupCell &cell);
448 void DrawGroupCell_UsingBitmap(wxDC *dc, GroupCell *cell);
449
451 void PrepareDrawGC(wxDC &dc) const;
452
453 void OnSize(wxSizeEvent &event);
454
455 void OnMouseRightDown(wxMouseEvent &event);
456
457 void OnSidebarKey(wxCommandEvent &event);
458
459 void OnMouseLeftUp(wxMouseEvent &event);
460
462 void OnMouseCaptureLost(wxMouseCaptureLostEvent &event);
463
464 void OnMouseLeftDown(wxMouseEvent &event);
465
466 void OnMouseLeftInGcCell(wxMouseEvent &event, GroupCell *clickedInGC);
467
468 void OnMouseLeftInGcLeft(wxMouseEvent &event, GroupCell *clickedInGC);
469
470 void OnMouseLeftInGc(wxMouseEvent &event, GroupCell *clickedInGC);
471
472 void OnMouseMotion(wxMouseEvent &event);
473
475 void OnDoubleClick(wxMouseEvent &event);
476
478 void OnCharInActive(wxKeyEvent &event);
479
481 void OnCharNoActive(wxKeyEvent &event);
482
484 void SelectEditable(EditorCell *editor, bool up);
485
492 void SelectWithChar(int ccode);
493
508 void ClickNDrag(wxPoint down, wxPoint up);
509
510 // Select all group cells inside the given rectangle;
511 void SelectGroupCells(wxPoint down, wxPoint up);
512
513public:
515 void AdjustSize() { m_layout.AdjustSize(); }
516
518 void OnEraseBackground(wxEraseEvent& WXUNUSED(event))
519 {}
520
521 void CheckUnixCopy();
522
523 void OnMouseMiddleUp(wxMouseEvent &event);
524
525 static bool IsLesserGCType(int type, int comparedTo);
526
529
532
534 void OnComplete(wxCommandEvent &event);
535
540 void EraseBackground(wxEraseEvent &event);
541
542private:
544 wxPoint m_leftDownPosition;
545 wxPoint m_down;
546 wxPoint m_up;
547 wxPoint m_mousePoint;
556 WorksheetCursor &GetHCaretCursor() { return m_document.GetCursor(); }
557 const WorksheetCursor &GetHCaretCursor() const { return m_document.GetCursor(); }
558 bool m_leftDown = false;
560 bool m_followEvaluation = true;
561 bool m_mouseDrag = false;
562 bool m_mouseOutside = false;
563
564public:
567private:
568 int m_clickType = CLICK_TYPE_NONE;
569 CellPtr<GroupCell> m_clickInGC;
576 CellPtr<GroupCell> m_asyncOutputTarget;
578 bool m_blinkDisplayCaret = true;
580 bool m_hCaretBlinkVisible = true;
582 wxTimer m_timer;
584 wxTimer m_caretTimer;
585 std::vector<wxString> m_completions;
586 bool m_autocompleteTemplates = true;
587 AutocompletePopup *m_autocompletePopup;
588
589public:
591 bool IsEmpty() const
592 { return !GetTree() || (!GetTree()->GetNext() && GetTree()->GetEditable()->GetValue().Length() <= 1); }
595 {
596 if(m_autocompletePopup != NULL)
597 m_autocompletePopup->Destroy();
598 }
599
605 void OnChar(wxKeyEvent &event);
606
611 void OnKeyDown(wxKeyEvent &event);
613 void SetCellStyle(GroupCell *group, GroupType style);
614
616 void NumberSections() const;
617
619 bool SectioningMoveIn(GroupCell *parent);
621 bool SectioningMoveOut(GroupCell *parent);
623 std::optional<Notification> &GetNotification() { return m_notificationMessage; }
624private:
626 std::optional<Notification> m_notificationMessage;
627public:
629 void WindowActive(bool active){m_windowActive = active;}
631 void ClearNotification();
636 void SetNotification(const wxString &message, int flags = wxICON_INFORMATION);
637
639 void OnActivate(wxActivateEvent &event);
640private:
643 std::unique_ptr<GroupCell> &TreeOwner() { return m_document.TreeOwner(); }
644 CellPtr<GroupCell> &LastCache() const { return m_document.LastCache(); }
645// std::vector<std::jthread> m_drawThreads;
646 static std::mutex m_drawDCLock;
649 Configuration *m_configuration = NULL;
656 WorksheetLayout m_layout;
657public:
658 void FocusFindDialogue()
659 {
661 pane->SetFocus();
662 }
669 AutoComplete &GetAutocomplete() { return m_autocomplete; }
670private:
671 AutoComplete m_autocomplete;
672public:
673
674 Configuration *GetConfig() const { return m_configuration; }
675
678
682
683 EditorCell *MouseSelectionStart() const
685
686 EditorCell *SearchStart() const
687 { return GetViewCellPointers().SearchStart(); }
688
689 int IndexSearchStartedAt() const
691
698
700 TextCell *GetCurrentTextCell() const { return GetDocumentCellPointers().GetCurrentTextCell(); }
701 void SetCurrentTextCell(TextCell *cell) { GetDocumentCellPointers().SetCurrentTextCell(cell); }
702 void SetWorkingGroup(GroupCell *group) { GetDocumentCellPointers().SetWorkingGroup(group); }
703
710
728 {
729 m_redrawStart = NULL;
730 m_fullRedrawRequested = false;
731 }
732
737 bool RedrawIfRequested();
738
751 void RequestRedraw(GroupCell *start = NULL);
761 void RequestRedraw(wxRect rect);
762
765 {
768 }
769
772
775 m_configuration->ReadConfig();
778 Refresh();
779 }
780
790
792 const wxString &GetCurrentFile() const { return m_document.GetCurrentFile(); }
794 void SetCurrentFile(const wxString &file) { m_document.SetCurrentFile(file); }
795
800 const wxString UnicodeToMaxima(wxString s);
801
803 void ScrollToStart() { Scroll(0, 0); }
804
806 void ScrollToError();
807
814
816 bool HCaretActive() const { return GetHCaretCursor().IsActive(); }
817
824
825 bool CanUndo() const;
826
827 bool CanRedo() const;
828
829 void Undo();
830
831 void Redo();
832
837 void TreeUndo_ClearBuffers();
838
848 Worksheet(wxWindow *parent, int id, Configuration *config,
849 wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize,
850 bool reactToEvents = true);
851
853 virtual ~Worksheet();
854
856 wxTimer &KeyboardInactiveTimer() { return m_keyboardInactiveTimer; }
857private:
858 wxTimer m_keyboardInactiveTimer;
859public:
860
862 void DestroyTree();
863
865 std::unique_ptr<GroupCell> CopyTree() const;
866
878 GroupCell *InsertGroupCells(std::unique_ptr<GroupCell> &&cells, GroupCell *where,
879 UndoActions *undoBuffer);
880
886 GroupCell *InsertGroupCells(std::unique_ptr<GroupCell> &&cells, GroupCell *where = NULL);
887
893 void InsertLine(std::unique_ptr<Cell> &&newCell, bool forceNewLine = false);
894
896 GroupCell *GetInsertGroup() const;
897
904 GroupCell *FindGroupCellByUUID(const wxString &uuid) const;
905
914 void SetAsyncOutputTarget(GroupCell *cell) { m_asyncOutputTarget = cell; }
916 GroupCell *GetAsyncOutputTarget() const { return m_asyncOutputTarget; }
917
922 public:
923 AsyncOutputTarget(Worksheet *worksheet, GroupCell *cell)
924 : m_worksheet(worksheet) {
925 if (m_worksheet)
926 m_worksheet->SetAsyncOutputTarget(cell);
927 }
929 if (m_worksheet)
930 m_worksheet->SetAsyncOutputTarget(nullptr);
931 }
932 AsyncOutputTarget(const AsyncOutputTarget &) = delete;
933 AsyncOutputTarget &operator=(const AsyncOutputTarget &) = delete;
934 private:
935 Worksheet *m_worksheet;
936 };
937
953 bool RecalculateIfNeeded(bool timeout = false, long timeSliceMs = 50)
954 { return m_layout.RecalculateIfNeeded(timeout, timeSliceMs); }
955
966 void RequestRecalculation(Cell *start) { m_layout.RequestRecalculation(start); }
967
978
980 int GetLastCellsVisited() const { return m_layout.GetLastCellsVisited(); }
982 int GetLastCellsRecalculated() const { return m_layout.GetLastCellsRecalculated(); }
983
988 void ClearDocument();
989
990 void ResetInputPrompts();
991
992 bool CanCopy() const
993 {
997 }
998
1007 bool CanCopyAsMathML() const;
1008
1009 bool CanPaste() const
1010 { return GetDocumentCellPointers().GetActiveCell() || GetHCaretCursor().IsActive(); }
1011
1012 bool CanCut() const
1013 {
1016 }
1017
1019 void SelectAll();
1020
1023
1034 void DeleteRegion(
1035 GroupCell *start,
1036 GroupCell *end,
1037 UndoActions *undoBuffer
1038 );
1039
1046 void DeleteRegion(
1047 GroupCell *start,
1048 GroupCell *end
1049 );
1050
1056 void DeleteSelection();
1057
1058 void TOCdnd(GroupCell *dndStart, GroupCell *dndEnd);
1059
1061 bool CanDeleteRegion(GroupCell *start, const GroupCell *end) const;
1062
1065
1070 void DeleteCurrentCell();
1071
1074 {
1076 return NULL;
1077 return dynamic_cast<AnimationCell *>(GetSelectionStart());
1078 }
1079
1082 {
1084 return NULL;
1085 return dynamic_cast<ImgCell *>(GetSelectionStart());
1086 }
1087
1090 {
1092 return NULL;
1093 return dynamic_cast<ImgCellBase *>(GetSelectionStart());
1094 }
1095
1098 {
1100 return NULL;
1101 return dynamic_cast<TextCell *>(GetSelectionStart());
1102 }
1103
1105 bool CanAnimate() const
1106 {
1108 (dynamic_cast<AnimationCell *>(GetSelectionStart()) != NULL);
1109 }
1110
1117 void Animate(bool run = true) const;
1118
1119 void DivideCell();
1120
1121 void MergeCells();
1122
1123 void SetLastQuestion(const wxString &lastQuestion){m_document.SetLastQuestion(lastQuestion);}
1124 wxString GetLastQuestion() const {return m_document.GetLastQuestion();}
1125
1127 bool CutToClipboard();
1128
1129 void PasteFromClipboard();
1130
1137 bool Copy(bool astext = false) const;
1138
1146 std::unique_ptr<wxDataObject> CreateSelectionDataObject() const;
1147
1149 bool CopyCells() const;
1150
1157 std::unique_ptr<wxDataObject> CreateCellsDataObject() const;
1158
1160 bool CopyMatlab() const;
1161
1163 bool CopyText() const;
1164
1166 bool CopyTeX() const;
1167
1169 wxString ConvertSelectionToMathML() const;
1170
1173
1175 bool CopyMathML() const;
1176
1178 bool CopyBitmap() const;
1179
1181 bool CopyAnimation() const;
1182
1184 bool CopySVG() const;
1185
1186#if wxUSE_ENH_METAFILE
1188 bool CopyEMF() const;
1189#endif
1190
1192 bool CopyRTF() const;
1193
1197 bool CopyHTML() const;
1198
1199 wxSize CopyToFile(const wxString &file) const;
1200
1201 wxSize CopyToFile(const wxString &file, Cell *start, Cell *end, bool asData = false, double scale = 1) const;
1202
1214 int ExportSelectionOutputToDir(const wxString &dir, bool svg);
1215
1220 bool ExportToHTML(const wxString &file);
1221
1223 bool ExportToMAC(const wxString &file);
1224
1226 wxString RTFStart() const;
1227
1229 wxString RTFEnd() const;
1230
1232 bool ExportToTeX(const wxString &file);
1233
1239 wxString GetString(bool lb = false) const;
1240
1241 GroupCell *GetTree() const { return m_document.GetTree(); }
1242 std::unique_ptr<GroupCell> *GetTreeAddress() { return &m_document.TreeOwner(); }
1243
1250
1257
1259 void ClearSelection() { SetSelection(nullptr, nullptr); }
1260
1262 void SetSelection(Cell *sel) { SetSelection(sel, sel); }
1263
1265 void SetSelection(Cell *start, Cell *end);
1266
1268 Cell *FindCellByUUID(const wxString &uuid);
1269
1272
1275 bool CanEdit() const { return m_document.CanEdit(); }
1276
1277 bool ActivatePrevInput() { return ActivateInput(-1); }
1278 bool ActivateNextInput() { return ActivateInput(+1); }
1279 wxString GetStatusText() const {return m_statusText;}
1280 bool StatusTextChangedHas() {
1281 bool retval = (m_statusTextHas != m_statusTextHas_old) ||
1282 (m_statusText != m_statusText_old);
1283 m_statusText_old = m_statusText;
1284 m_statusTextHas_old = m_statusTextHas;
1285 return retval;
1286 }
1287 bool StatusTextHas() const {return m_statusTextHas;}
1288private:
1289 /* ! A timer that tells us to urgently update the display
1290
1291 Normally we prioritize tasks: If there are GUI actions to process we do so.
1292 If not we look if there is data from maxima to process. If not we
1293 If not we recalculate the worksheet element sizes and positions and if
1294 there still is no pressing task we update the display. This way we
1295 respond quickly to the most important inputs.
1296
1297 This timer, if expired, tells us that if we don't update the screen now
1298 maxima feels like not being responsive.
1299 */
1300 wxTimer m_displayTimeoutTimer;
1301
1302 template <class T_SRC, class T_DEST>
1303 inline std::unique_ptr<T_DEST> unique_cast(std::unique_ptr<T_SRC> &&src)
1304 {
1305 if (!src) return std::unique_ptr<T_DEST>();
1306
1307 T_DEST *dest_ptr = &dynamic_cast<T_DEST &>(*src.get());
1308
1309 (void) src.release();
1310 return std::unique_ptr<T_DEST>(dest_ptr);
1311 }
1312 wxString m_statusText;
1313 wxString m_statusText_old;
1314 bool m_statusTextHas = false;
1315 bool m_statusTextHas_old = false;
1316 void StatusText(const wxString &text){m_statusText = text; m_statusTextHas = true;}
1317 void UnsetStatusText(){m_statusTextHas = false;}
1318 bool ActivateInput(int direction);
1319
1320public:
1323 {
1325 m_scrollToCaret = true;
1326 }
1327
1329 bool ScrollToCaretIfNeeded();
1330
1332 void ScrollToCellIfNeeded();
1333
1335 void ScheduleScrollToCell(Cell *cell, bool scrollToTop = true)
1336 {
1337 GetViewCellPointers().ScrollToCell(cell);
1338 m_scrollToTopOfCell = scrollToTop;
1339 m_scrollToCaret = false;
1340
1342 }
1343
1345 bool PointVisibleIs(wxPoint point);
1346
1348 bool CaretVisibleIs();
1349
1352
1366 void ShowPoint(wxPoint point);
1367
1369 void OnSetFocus(wxFocusEvent &event);
1370
1372 void OnKillFocus(wxFocusEvent &event);
1373
1375 bool IsSelected(CellType type) const { return m_document.IsSelected(type); }
1376
1383 void StepAnimation(int change = 1);
1384
1386 bool IsActiveInLast() const
1388
1391 {
1392 return GetLastCellInWorksheet();
1393 }
1394
1397
1398 void SetActiveCell(EditorCell *cell);
1399
1403 void SetDefaultHCaret();
1404
1409 void SetHCaret(GroupCell *where); // call with false, when manually refreshing
1412
1414 void OpenHCaret(const wxString &txt = {})
1415 {
1416 if(m_mainToolBar == NULL)
1417 OpenHCaret(txt, GC_TYPE_CODE);
1418 else
1420 }
1421
1423 void OpenHCaret(const wxString &txt, GroupType type);
1424
1426 void ShowHCaret();
1427
1433
1434 void UndoInsideCell();
1435
1441
1442 void RedoInsideCell();
1443
1453 void FollowEvaluation(bool followEvaluation);
1454
1456 bool FollowEvaluation() const
1457 { return m_followEvaluation; }
1458
1464 void ScrolledAwayFromEvaluation(bool ScrolledAway);
1465
1466 bool ScrolledAwayFromEvaluation() const
1467 { return m_scrolledAwayFromEvaluation; }
1468
1469 void SaveValue();
1470
1471 bool IsSaved() const
1472 { return m_document.IsSaved(); }
1473
1474 void SetSaved(bool saved)
1475 { m_document.SetSaved(saved); }
1476
1477 void OutputChanged()
1479
1481 void RemoveAllOutput();
1482
1490 void RemoveAllOutput(GroupCell *cell);
1491 // methods related to evaluation queue
1492
1498 void Evaluate();
1499
1501 void AddToEvaluationQueue(GroupCell *cell);
1502
1503 void AddDocumentToEvaluationQueue();
1504
1507
1510
1513
1516
1519
1522
1525
1528
1529 void FoldOccurred();
1530
1531 // methods for folding
1533 GroupCell *Fold(GroupCell *which) { return m_document.Fold(which); }
1534
1536 GroupCell *Unfold(GroupCell *which) { return m_document.Unfold(which); }
1537
1540
1541 GroupCell *ToggleFoldAll(GroupCell *which) { return m_document.ToggleFoldAll(which); }
1542
1543 void FoldAll() { m_document.FoldAll(); }
1544
1545 void UnfoldAll() { m_document.UnfoldAll(); }
1546
1547 // methods for zooming the document in and out
1548 void SetZoomFactor(double newzoom);
1549
1550 void CommentSelection();
1551
1556 void OnScrollChanged(wxScrollEvent &ev);
1557 void OnScrollEvent(wxScrollWinEvent &ev);
1558 void CheckIfActiveCellScrolledOut();
1563 void OnMouseWheel(wxMouseEvent &event);
1564
1570 bool FindIncremental(const wxString &str, bool down, bool ignoreCase, bool searchInInput = true, bool searchInOutput = true);
1571 bool FindIncremental_RegEx(const wxString &str, bool down, bool searchInInput = true, bool searchInOutput = true);
1572
1573private:
1577 WorksheetSearch::SearchStart FindStart(bool down);
1583 bool ApplyFindResult(const WorksheetSearch::SearchTarget &target, bool warn);
1584public:
1591 bool FindNext(const wxString &str, bool down, bool ignoreCase, bool searchInInput = true, bool searchInOutput = true, bool warn = true);
1592 bool FindNext_Regex(const wxString &str, const bool &down, bool searchInInput = true, bool searchInOutput = true, bool warn = true);
1593
1598 void Replace(const wxString &oldString, const wxString &newString, bool ignoreCase);
1599 void Replace_RegEx(const wxString &oldString, const wxString &newString);
1600
1605 int ReplaceAll(const wxString &oldString, const wxString &newString, bool ignoreCase, bool searchInInput = true, bool searchInOutput = true);
1606 int ReplaceAll_RegEx(const wxString &oldString, const wxString &newString, bool searchInInput = true, bool searchInOutput = true);
1607
1618 void AnonymizeCodeCells();
1619
1620 wxString GetInputAboveCaret();
1621
1622 wxString GetOutputAboveCaret();
1623
1625 void LoadSymbols();
1626
1627 bool Autocomplete(AutoComplete::autoCompletionType type = AutoComplete::command);
1628
1630 void AddSymbol(const wxString &fun, AutoComplete::autoCompletionType type = AutoComplete::command)
1631 { m_autocomplete.AddSymbol(fun, type); }
1632
1634 void AddSymbols(const wxString &xml)
1635 { m_autocomplete.AddSymbols(xml); }
1637 void AddSymbols(wxXmlDocument xml)
1638 { m_autocomplete.AddSymbols(xml); }
1639
1640 void SetActiveCellText(const wxString &text);
1641
1642 bool InsertText(const wxString &text);
1643
1644 void OpenNextOrCreateCell();
1645
1647 void OnFollow();
1648
1651
1653 void SelectGroupCell(GroupCell *cell);
1654
1659 void SetAnswer(const wxString &answer);
1661 void QuestionAnswered();
1662
1667 bool QuestionPending() const
1668 { return m_document.QuestionPending(); }
1670
1674 void QuestionPending(bool pending)
1675 { m_document.SetQuestionPending(pending); }
1676
1677 void SetMaximaDocDir(const wxString &dir)
1678 {
1679 m_maximaDocDir = dir;
1680 }
1681 const wxString &GetMaximaDocDir() const { return m_maximaDocDir; }
1682
1684 bool GCContainsCurrentQuestion(const GroupCell *cell);
1685
1688 bool OpenQuestionCaret(const wxString &txt = {});
1689
1698 bool WillAutoAnswer() const;
1699 void UpdateScrollPos();
1700
1706 GroupCell *GetWorkingGroup(bool resortToLast = false) const;
1708 void LoadHelpFileAnchors(const wxString &docdir, const wxString &maximaVersion)
1709 {m_maximaManual.LoadHelpFileAnchors(docdir, maximaVersion);}
1710 wxString GetHelpfileAnchorName(const wxString &keyword)
1711 {return m_maximaManual.GetHelpfileAnchorName(keyword);}
1712 wxString GetHelpfileURL(const wxString &keyword)
1713 {return m_maximaManual.GetHelpfileURL(keyword);}
1714
1716 std::vector<wxString> m_replacementsForCurrentWord;
1717#if wxUSE_ACCESSIBILITY
1718 int GetAccessibilityId(Cell *cell) const;
1719#endif
1720
1721#if wxUSE_ACCESSIBILITY
1722 class AccessibilityInfo: public wxAccessible
1723 {
1724 public:
1725 AccessibilityInfo(wxWindow *parent, Worksheet *worksheet);
1726 wxAccStatus GetName (int childId, wxString *name);
1727 wxAccStatus GetChildCount (int *childCount);
1728 wxAccStatus GetChild (int childId, wxAccessible **child);
1729 wxAccStatus GetDefaultAction(int childId, wxString *actionName);
1730 wxAccStatus GetParent (wxAccessible ** parent);
1731 wxAccStatus GetFocus (int *childId, wxAccessible **child);
1732 wxAccStatus GetLocation (wxRect &rect, int elementId);
1733 wxAccStatus HitTest (const wxPoint &pt,
1734 int *childId, wxAccessible **childObject);
1735 wxAccStatus GetDescription(int childId, wxString *description);
1736 wxAccStatus GetRole(int childId, wxAccRole *role);
1737 wxAccStatus GetState(int childId, long *state);
1738 private:
1739 wxWindow *m_parent = NULL;
1740 Worksheet *m_worksheet = NULL;
1741
1742 class CaretAccessibilityInfo : public wxAccessible {
1743 public:
1744 CaretAccessibilityInfo(AccessibilityInfo* parent, Worksheet* worksheet)
1745 : wxAccessible(worksheet->GetTargetWindow()), m_parent(parent), m_worksheet(worksheet) {}
1746
1747 wxAccStatus GetName(int childId, wxString *name) override;
1748 wxAccStatus GetDescription(int WXUNUSED(childId), wxString *description) override;
1749 wxAccStatus GetParent(wxAccessible **parent) override;
1750 wxAccStatus GetChildCount(int *childCount) override;
1751 wxAccStatus GetChild(int childId, wxAccessible **child) override;
1752 wxAccStatus GetRole(int childId, wxAccRole *role) override;
1753 private:
1754 AccessibilityInfo* m_parent;
1755 Worksheet* m_worksheet;
1756 };
1757 CaretAccessibilityInfo* m_caretAccessible = nullptr;
1758 };
1759#endif
1760 MaximaManual m_maximaManual;
1761 MaximaManual *GetMaximaManual() {return &m_maximaManual;}
1762protected:
1763 void FocusTextControl();
1773 wxBitmap m_memory;
1774 virtual wxSize DoGetBestClientSize() const override;
1775#if wxUSE_ACCESSIBILITY
1776 AccessibilityInfo *m_accessibilityInfo = NULL;
1777#endif
1779 int m_pointer_x = -1;
1781 int m_pointer_y = -1;
1783 bool m_mouseMotionWas = false;
1785 bool m_inPopupMenu = false;
1786};
1787
1788wxDECLARE_EVENT(TOC_UPDATE_NEEDED_EVENT, wxCommandEvent);
1789
1790#endif // WORKSHEET_H
This file declares the class AnimationCell.
The first number that is open for dynamic ID assignment.
This file declares the class AutoComplete.
The definition of the base class of all cells the worksheet consists of.
CellType
The supported types of math cells.
Definition: Cell.h:64
@ MC_TYPE_GROUP
A group cells that bundles several individual cells together.
Definition: Cell.h:82
This file contains the definition of the class EditorCell.
The evaluation queue.
This file declares the class EventIDs that contains unique IDs for many events wxMaxima needs.
This file defines the class FindReplaceDialog.
This file defines the class GroupCell that bundles input and output in the worksheet.
GroupType
All types a GroupCell can be of.
Definition: GroupCell.h:43
This file declares the class MaximaManual.
This file defines the class Notification.
The definition of the class RecentDocuments that provides a recent files mechanism that is extensible...
This file declares the class ToolBar that represents wxMaxima's main tool bar.
std::list< TreeUndoAction > UndoActions
The type of the list of tree actions that can be undone.
Definition: TreeUndoAction.h:141
Declares TreeUndoManager: the owner of the cell-tree undo/redo state.
This file contains the definition of the class Unicodesidebar that allows to select arbitrary unicode...
The file that contains the "variables" sidepane.
The worksheet's "between the cells" cursor (the horizontally drawn caret).
The narrow "something in the document changed" surface a WorksheetDocument needs to poke its view.
The document half of the worksheet: the state and commands that describe the edited document itself,...
The worksheet's layout engine: scheduling, the recalculation walk and the virtual-size update,...
The worksheet's search engine.
Definition: AnimationCell.h:46
Definition: Autocomplete.h:61
autoCompletionType
All types of things we can autocomplete.
Definition: Autocomplete.h:68
void AddSymbols(wxString xml)
Interprets the XML autocompletable symbol list maxima can send us.
Definition: Autocomplete.cpp:135
void AddSymbol(wxString fun, autoCompletionType type=command)
Manually add an autocompletable symbol to our symbols lists.
Definition: Autocomplete.cpp:686
Definition: AutocompletePopup.h:47
A weak non-owning pointer that becomes null whenever the observed object is destroyed.
Definition: CellPtr.h:539
The base class all cell types the worksheet can consist of are derived from.
Definition: Cell.h:148
GroupCell * GetGroup() const
Returns the group cell this cell belongs to.
Definition: Cell.cpp:285
CellType GetType() const
Returns the type of this cell.
Definition: Cell.h:489
The configuration storage for the current worksheet.
Definition: Configuration.h:98
void ReadConfig()
Read the config from the wxConfig object.
Definition: Configuration.cpp:619
A list of editor cells containing error messages.
Definition: CellPointers.h:54
The document-model half of the cell-pointer registry.
Definition: CellPointers.h:50
TextCell * GetCurrentTextCell() const
The text cell the text maxima is currently sending us is being appended to.
Definition: CellPointers.cpp:134
const CellPtr< Cell > & GetSelectionStart() const
The first cell of the currently selected range of cells, or null. Returned by reference so callers ke...
Definition: CellPointers.h:93
const CellPtr< Cell > & GetSelectionEnd() const
The last cell of the currently selected range of cells, or null.
Definition: CellPointers.h:95
void SetCurrentTextCell(TextCell *cell)
Set the text cell maxima's incoming text is being appended to (may be null).
Definition: CellPointers.cpp:138
bool HasCellsSelected() const
Are any whole cells (as opposed to text inside an editor) selected?
Definition: CellPointers.h:88
void SetWorkingGroup(GroupCell *group)
Sets the cell maxima currently works on. NULL if there isn't such a cell.
Definition: CellPointers.cpp:146
ErrorList & GetErrorList()
The list of cells maxima has complained about errors in.
Definition: CellPointers.h:134
EditorCell * GetActiveCell() const
The editor cell the blinking text cursor is in, or null.
Definition: CellPointers.cpp:142
This class defines what the user sees as input cell.
Definition: EditorCell.h:62
const wxString & GetValue() const override
Returns the text contained in this cell.
Definition: EditorCell.h:225
bool CanCopy() const override
Select Can we copy the editable text of this cell?
Definition: EditorCell.h:377
A simple FIFO queue with manual removal of elements.
Definition: EvaluationQueue.h:44
The find+replace dialog.
Definition: FindReplaceDialog.h:42
The find+replace pane.
Definition: FindReplacePane.h:46
A cell grouping input (and, if there is one, also the output) cell to a foldable item.
Definition: GroupCell.h:88
GroupCell * GetNext() const
Get the next GroupCell in the list.
Definition: GroupCell.h:280
Definition: ImgCellBase.h:42
Definition: ImgCell.h:35
Definition: MaximaManual.h:59
void LoadHelpFileAnchors(const wxString &docdir, const wxString &maximaVersion)
Search maxima's help file for command and variable names.
Definition: MaximaManual.cpp:538
A class that maintains a list of recent documents.
Definition: RecentDocuments.h:42
A Text cell.
Definition: TextCell.h:38
Definition: ToolBar.h:41
GroupType GetCellType()
Get the cell style for new cells.
Definition: ToolBar.cpp:698
Owns the cell-tree undo/redo stacks and the active-cell snapshot.
Definition: TreeUndoManager.h:51
void ClearUndoActionList()
Clear the list of actions that can be undone.
Definition: TreeUndoManager.h:94
void ClearRedoActionList()
Clear the list of actions that can be redone.
Definition: TreeUndoManager.h:87
static void AppendAction(UndoActions *actionList)
Mark the newest action of the list as part of the following atomic action.
Definition: TreeUndoManager.h:77
The view/interaction half of the cell-pointer registry.
Definition: CellPointers.h:187
const CellPtr< EditorCell > & MouseSelectionStart() const
The EditorCell a mouse selection was started in, or null.
Definition: CellPointers.h:214
int IndexSearchStartedAt() const
The cursor position an incremental search was started at (-1 = none).
Definition: CellPointers.h:202
const CellPtr< EditorCell > & KeyboardSelectionStart() const
The EditorCell a keyboard selection was started in, or null.
Definition: CellPointers.h:223
const CellPtr< EditorCell > & SearchStart() const
The EditorCell an incremental search was started in, or null.
Definition: CellPointers.h:200
void SetScrollToCellScheduled(bool scheduled)
Schedule (or cancel) scrolling to CellToScrollTo().
Definition: CellPointers.h:197
The between-the-cells cursor: active flag, position, selection anchors.
Definition: WorksheetCursor.h:49
bool IsActive() const
Is this (rather than the in-cell text cursor) the active cursor?
Definition: WorksheetCursor.h:52
The view notifications a WorksheetDocument emits when it edits itself.
Definition: WorksheetDocumentView.h:50
The view-independent state and commands of an edited worksheet document.
Definition: WorksheetDocument.h:61
bool CanMergeSelection() const
Can the current selection (of more than one cell) be merged into one?
Definition: WorksheetDocument.cpp:361
CellPtr< GroupCell > & LastCache() const
The cached pointer to the document's last GroupCell (<0 = unknown).
Definition: WorksheetDocument.h:93
bool CanRedoInsideCell() const
Can the active cell's own (intra-cell) redo be invoked right now?
Definition: WorksheetDocument.cpp:390
void SetSaved(bool saved)
Record whether the document is in its saved state.
Definition: WorksheetDocument.cpp:34
void FoldAll()
Recursively folds every foldable cell in the document.
Definition: WorksheetDocument.cpp:317
void UnfoldAll()
Recursively unfolds every folded cell in the document.
Definition: WorksheetDocument.cpp:326
bool QuestionPending() const
Is Maxima currently waiting for an answer to a question?
Definition: WorksheetDocument.h:215
bool CanUndoInsideCell() const
Can the active cell's own (intra-cell) undo be invoked right now?
Definition: WorksheetDocument.cpp:386
bool IsSaved() const
True while the document has no unsaved changes.
Definition: WorksheetDocument.h:226
void SetCurrentFile(const wxString &file)
Record the file this document is associated with.
Definition: WorksheetDocument.h:205
EvaluationQueue & GetEvaluationQueue()
The list of cells scheduled to be sent to Maxima for evaluation.
Definition: WorksheetDocument.h:64
GroupCell * Unfold(GroupCell *which)
Unfold which; see GroupCell::Unfold(). Mirrors Fold().
Definition: WorksheetDocument.cpp:277
bool IsSelectionInWorkingGroup() const
Is the selection start inside the group Maxima is currently evaluating?
Definition: WorksheetDocument.cpp:381
DocumentCellPointers & GetCellPointers()
The document-model half of the cell-pointer registry (selection, the active/answer/current-text cell,...
Definition: WorksheetDocument.h:221
bool IsSelected(CellType type) const
Is the selection exactly one cell of the given type?
Definition: WorksheetDocument.cpp:374
GroupCell * ToggleFold(GroupCell *which)
Fold or unfold which, whichever it currently isn't; see GroupCell::Fold()/Unfold().
Definition: WorksheetDocument.cpp:292
TreeUndoManager & GetTreeUndo()
The document's undo/redo history of tree-structure edits.
Definition: WorksheetDocument.h:69
const wxString & GetCurrentFile() const
The file this document was last loaded from / saved to (empty if none).
Definition: WorksheetDocument.h:203
std::unique_ptr< GroupCell > & TreeOwner()
Mutable access to the owning pointer of the cell tree.
Definition: WorksheetDocument.h:87
const wxString & GetLastQuestion() const
The text of the Maxima question the user is currently being asked.
Definition: WorksheetDocument.h:208
bool CanDeleteSelection() const
Can the current selection be deleted right now (see CanRemoveCells())?
Definition: WorksheetDocument.cpp:353
bool CanEdit() const
Is exactly one cell selected, and does it directly follow Maxima's own input prompt (as opposed to be...
Definition: WorksheetDocument.cpp:335
void SetQuestionPending(bool pending)
Record whether Maxima is waiting for an answer to a question.
Definition: WorksheetDocument.h:217
WorksheetCursor & GetCursor()
The between-cells cursor (the h-caret) and its group-level selection.
Definition: WorksheetDocument.h:74
GroupCell * GetTree() const
The first GroupCell of the document (null when the document is empty).
Definition: WorksheetDocument.h:79
void SetLastQuestion(const wxString &lastQuestion)
Remember the text of the question Maxima is currently asking.
Definition: WorksheetDocument.h:210
GroupCell * ToggleFoldAll(GroupCell *which)
Like ToggleFold(), but folds/unfolds which's whole subtree.
Definition: WorksheetDocument.cpp:299
void OutputChanged()
Note that a cell's output changed.
Definition: WorksheetDocument.h:241
GroupCell * Fold(GroupCell *which)
Fold which; see GroupCell::Fold().
Definition: WorksheetDocument.cpp:262
The layout/recalculation engine of a worksheet.
Definition: WorksheetLayout.h:54
void RequestFullRecalculation()
Schedule a recalculation of the whole worksheet.
Definition: WorksheetLayout.cpp:237
void RequestAdjustSize()
Flag the virtual (scroll) size as needing re-adjustment.
Definition: WorksheetLayout.h:143
void RequestRecalculation(Cell *start)
Schedule a recalculation of the worksheet starting with the cell start.
Definition: WorksheetLayout.cpp:179
void GetMaxPoint(int *width, int *height)
Get the coordinates of the bottom right point of the worksheet.
Definition: WorksheetLayout.cpp:259
void UpdateConfigurationClientSize()
Inform the configuration about the view's current client size.
Definition: WorksheetLayout.cpp:246
int GetLastCellsVisited() const
GroupCells walked by the most recent RecalculateIfNeeded() pass (visited includes cheap reposition-on...
Definition: WorksheetLayout.h:156
void AdjustSize()
Adjust the virtual size and scrollbars to the document's extent.
Definition: WorksheetLayout.cpp:305
bool RecalculateIfNeeded(bool timeout=false, long timeSliceMs=50)
Perform the scheduled recalculation, if one is pending.
Definition: WorksheetLayout.cpp:41
The narrow view surface the worksheet's layout pipeline needs.
Definition: WorksheetSizeMath.h:172
Scoped SetAsyncOutputTarget(), so an early return or a throw while appending can't leave every subseq...
Definition: Worksheet.h:921
The canvas that contains the spreadsheet the whole program is about.
Definition: Worksheet.h:116
bool IsActiveInLast() const
Is the editor active in the last cell of the worksheet?
Definition: Worksheet.h:1386
GroupCell * ToggleFold(GroupCell *which)
Fold or unfold a cell.
Definition: Worksheet.h:1539
void OnTimer(wxTimerEvent &event)
Is executed if a timer associated with Worksheet has expired.
Definition: Worksheet.cpp:3400
void ClearSelection()
Clear the selection - make it empty, i.e. no selection.
Definition: Worksheet.h:1259
const wxString UnicodeToMaxima(wxString s)
Make a few unicode characters interpretable by maxima.
Definition: Worksheet.cpp:3802
bool CanMergeSelection() const
Can we merge the selected cells into one?
Definition: Worksheet.h:823
bool IsSelectionInWorkingGroup() const
Is the selection in the current working group?
Definition: Worksheet.h:1396
int GetLastCellsRecalculated() const
How many cells the last layout pass truly recalculated. See WorksheetLayout.
Definition: Worksheet.h:982
void SetViewScrollRate(int rate) override
Set the scroll granularity (device pixels per scroll unit) on both axes.
Definition: Worksheet.h:126
ImgCellBase * GetSelectedImgCellBase() const
Returns the selected cell - or NULL, if the selection isn't image nor animation.
Definition: Worksheet.h:1089
wxString RTFStart() const
The start of a RTF document.
Definition: Worksheet.cpp:6166
int m_pointer_x
The x position of the mouse pointer.
Definition: Worksheet.h:1779
void SetDefaultHCaret()
Set the HCaret to its default location, at the end of the document.
Definition: Worksheet.cpp:4971
bool CanDeleteRegion(GroupCell *start, const GroupCell *end) const
Is it possible to delete the cells between start and end?
Definition: Worksheet.cpp:2157
void AddSectionToEvaluationQueue(GroupCell *start)
Adds a chapter, a section or a subsection to the evaluation queue.
Definition: Worksheet.cpp:4094
void AddSymbols(const wxString &xml)
Add a xml-encoded list of symbols to the autocompletion list.
Definition: Worksheet.h:1634
virtual ~Worksheet()
The destructor.
Definition: Worksheet.cpp:535
bool CutToClipboard()
Add the currently selected cells to the clipboard and delete them.
Definition: Worksheet.cpp:4669
void GetViewPosition(int *x, int *y) const override
The view's position within its parent, in device pixels (wxWindow::GetPosition).
Definition: Worksheet.h:127
WorksheetDocument m_document
The view-independent document state (file, current question, ...) that Worksheet's document accessors...
Definition: Worksheet.h:1767
FindReplacePane * m_findPane
The dockable find-and-replace sidebar (GH #2249), set once by wxMaximaFrame at startup and never dest...
Definition: Worksheet.h:813
std::unique_ptr< wxDataObject > CreateCellsDataObject() const
Build the multi-format clipboard object for a whole-cell selection.
Definition: Worksheet.cpp:2070
GroupCell * GetInsertGroup() const
The group that the line's cells will belong to - used by InsertLine.
Definition: Worksheet.cpp:977
void OnCharNoActive(wxKeyEvent &event)
Key pressed and no cell was active.
Definition: Worksheet.cpp:2924
bool QuestionPending() const
Does maxima wait for the answer of a question?
Definition: Worksheet.h:1667
void AddEntireDocumentToEvaluationQueue()
Schedule all cells in the document for evaluation.
Definition: Worksheet.cpp:4085
GroupCell * FirstVisibleGC()
The first groupCell that is currently visible.
Definition: Worksheet.cpp:1522
void SetAsyncOutputTarget(GroupCell *cell)
Routes output to one specific cell instead of the one being evaluated.
Definition: Worksheet.h:914
void UpdateConfigurationClientSize()
Inform the configuration about the current client size.
Definition: Worksheet.h:1271
int ReplaceAll(const wxString &oldString, const wxString &newString, bool ignoreCase, bool searchInInput=true, bool searchInOutput=true)
Replace all occurrences of a string.
Definition: Worksheet.cpp:5443
void AddSymbols(wxXmlDocument xml)
Add a xml-encoded list of symbols to the autocompletion list.
Definition: Worksheet.h:1637
void LoadHelpFileAnchors(const wxString &docdir, const wxString &maximaVersion)
Tries to parse maxima's manual in order to find out which anchors it contains.
Definition: Worksheet.h:1708
bool ExportToHTML(const wxString &file)
Export the file to an html document.
Definition: Worksheet.cpp:3771
void OpenHCaret(const wxString &txt={})
Place the cursor into a new cell where the horizontal cursor is.
Definition: Worksheet.h:1414
void NotifyAdjustSizeNeeded() override
The scrollable size will need re-adjusting once cell positions settle.
Definition: Worksheet.h:135
void ApplyOverlayScrollbarsSetting()
Apply the configuration's OverlayScrollbars() choice to this window.
Definition: Worksheet.cpp:510
TextCell * GetSelectedTextCell() const
Returns the selected cell - or NULL, if the selection isn't a text cell.
Definition: Worksheet.h:1097
void ScrollToError()
Unfold the cell that produced the error, if necessary and, if requested, scroll to it.
Definition: Worksheet.cpp:899
bool HCaretActive() const
Is the vertically-drawn cursor active?
Definition: Worksheet.h:816
void OnEraseBackground(wxEraseEvent &WXUNUSED(event))
Cannot be static as it is called using a function pointer to an object.
Definition: Worksheet.h:518
void ClearDocument()
Empties the current document.
Definition: Worksheet.cpp:1120
wxString RTFEnd() const
The end of a RTF document.
Definition: Worksheet.cpp:6170
ViewCellPointers m_viewCellPointers
The transient view-state half of the cell-pointer registry (hover, selection anchors,...
Definition: Worksheet.h:1771
void UpdateTableOfContents()
Update the table of contents.
Definition: Worksheet.cpp:6496
void RemoveAllOutput()
Remove all output cells from the whole worksheet.
Definition: Worksheet.cpp:5044
Cell * GetSelectionEnd() const
Return the last of the currently selected cells.
Definition: Worksheet.h:1255
void QuestionPending(bool pending)
Does maxima currently wait for the answer of a question?
Definition: Worksheet.h:1674
void ClickNDrag(wxPoint down, wxPoint up)
Select the rectangle surrounded by down and up.
Definition: Worksheet.cpp:1674
FindReplacePane * GetActiveFindPane() const
Whichever find/replace UI is actually in use right now: the dockable sidebar (GH #2249) if Configurat...
Definition: Worksheet.cpp:5249
DocumentCellPointers & GetDocumentCellPointers()
The document-model half of the cell-pointer registry (owned by m_document).
Definition: Worksheet.h:693
const wxString & GetCurrentFile() const
The name of the currently-opened file.
Definition: Worksheet.h:792
void SetCurrentFile(const wxString &file)
Set the name of the currently-opened file.
Definition: Worksheet.h:794
RecentDocuments & UnsavedDocuments()
The list of unsaved (autosaved) documents offered for recovery.
Definition: Worksheet.h:139
bool CopyHTML() const
Copy a self-contained HTML version (inline CSS, base64-embedded images – see WorksheetExport::Selecti...
Definition: Worksheet.cpp:3577
void DeleteCurrentCell()
Delete the currently active cell - or the cell above this one.
Definition: Worksheet.cpp:2142
AutoComplete & GetAutocomplete()
The storage for the autocompletion feature.
Definition: Worksheet.h:669
AnimationCell * GetSelectedAnimation() const
Returns the selected cell - or NULL, if the selection isn't an animation.
Definition: Worksheet.h:1073
void Replace(const wxString &oldString, const wxString &newString, bool ignoreCase)
Replace the current occurrence of a string.
Definition: Worksheet.cpp:5409
bool CopyMatlab() const
Copy a Matlab representation of the current selection to the clipboard.
Definition: Worksheet.cpp:1962
bool CopyText() const
Copy a textual representation of the current selection to the clipboard.
Definition: Worksheet.cpp:2025
bool m_inPopupMenu
Is there an active popup menu?
Definition: Worksheet.h:1785
EvaluationQueue & GetEvaluationQueue()
The list of cells that have to be evaluated.
Definition: Worksheet.h:1527
void Animate(bool run=true) const
Animate the current slide show.
Definition: Worksheet.cpp:4948
static GroupCell * StartOfSectioningUnit(GroupCell *start)
Finds the start of the current chapter/section/...
Definition: Worksheet.cpp:2539
bool CopyRTF() const
Copy a rtf version of the current selection to the clipboard.
Definition: Worksheet.cpp:3546
void UpdateConfig()
Re-read the configuration.
Definition: Worksheet.h:774
int m_pointer_y
The y position of the mouse pointer.
Definition: Worksheet.h:1781
bool Copy(bool astext=false) const
Copy the current selection to the clipboard.
Definition: Worksheet.cpp:1781
bool CopyAnimation() const
Copy the current animation to the clipboard.
Definition: Worksheet.cpp:3524
void StepAnimation(int change=1)
Set the slide of the currently selected animation or advance it by one step.
Definition: Worksheet.cpp:3374
GroupCell * Unfold(GroupCell *which)
Unfold a cell (see WorksheetDocument::Unfold())
Definition: Worksheet.h:1536
void SelectEditable(EditorCell *editor, bool up)
Is called when a hCursor is active and we have a WXK_UP/WXK_DOWN event.
Definition: Worksheet.cpp:2893
void SetAnswer(const wxString &answer)
Handling questions from and answers for maxima.
Definition: Worksheet.cpp:2266
ViewCellPointers & GetViewCellPointers()
The transient view-state half of the cell-pointer registry (owned here).
Definition: Worksheet.h:696
void OnChar(wxKeyEvent &event)
Key for a printable character pressed.
Definition: Worksheet.cpp:3258
void SelectWithChar(int ccode)
Handle selecting text using the keyboard Is called when the all of the following is true:
Definition: Worksheet.cpp:2808
void AddSelectionToEvaluationQueue()
Schedule all cells in the selection to be evaluated.
Definition: Worksheet.cpp:4123
bool HasCellsSelected() const
Is at least one entire cell selected?
Definition: Worksheet.h:1022
std::optional< Notification > & GetNotification()
The error notification message, if any.
Definition: Worksheet.h:623
void OnSetFocus(wxFocusEvent &event)
What to do if the worksheet is in the input focus.
Definition: Worksheet.cpp:4908
void SetNotification(const wxString &message, int flags=wxICON_INFORMATION)
Inform the user that something happened in a non-active window.
Definition: Worksheet.cpp:3236
bool IsSelected(CellType type) const
Does the selection start with a cell of the type "type".
Definition: Worksheet.h:1375
GroupCell * GetAsyncOutputTarget() const
The cell async output is currently being routed to, if any.
Definition: Worksheet.h:916
void ScheduleScrollToCell(Cell *cell, bool scrollToTop=true)
Schedules scrolling to a given cell.
Definition: Worksheet.h:1335
int GetViewScrollUnitY() const override
The current vertical scroll position, in scroll units (not pixels).
Definition: Worksheet.h:122
GroupCell * InsertGroupCells(std::unique_ptr< GroupCell > &&cells, GroupCell *where, UndoActions *undoBuffer)
Insert group cells into the worksheet.
Definition: Worksheet.cpp:879
void AddDocumentTillHereToEvaluationQueue()
Schedule all cells stopping with the one the caret is in for evaluation.
Definition: Worksheet.cpp:4139
void OnComplete(wxCommandEvent &event)
Is called if an action from the autocomplete menu is selected.
Definition: Worksheet.cpp:5906
bool CanAnimate() const
Does it make sense to enable the "Play" button and the slider now?
Definition: Worksheet.h:1105
bool RecalculateIfNeeded(bool timeout=false, long timeSliceMs=50)
Actually recalculate the worksheet.
Definition: Worksheet.h:953
bool m_mouseMotionWas
Was there a mouse motion we didn't react to until now?
Definition: Worksheet.h:1783
void SelectAll()
Select the whole document.
Definition: Worksheet.cpp:4831
void OnKillFocus(wxFocusEvent &event)
What to do if the worksheet looses the input focus.
Definition: Worksheet.cpp:4920
void InsertLine(std::unique_ptr< Cell > &&newCell, bool forceNewLine=false)
Add a new line to the output cell of the working group.
Definition: Worksheet.cpp:994
void ClearNotification()
Clears the notification message from SetNotification.
Definition: Worksheet.cpp:3234
void OnPaint(wxPaintEvent &event)
Is called by wxWidgets when it wants to redraw the worksheet or a part of it.
Definition: Worksheet.cpp:578
void OnFollow()
Called when the "Scroll to currently evaluated" button is pressed.
Definition: Worksheet.cpp:6090
void PrepareDrawGC(wxDC &dc) const
All that has need to be done before drawing a GroupCell in a DC.
Definition: Worksheet.cpp:755
void OnCharInActive(wxKeyEvent &event)
Key pressed inside a cell.
Definition: Worksheet.cpp:2583
Cell * GetSelectionStart() const
Return the first of the currently selected cells.
Definition: Worksheet.h:1248
void FoldOccurred()
Call when a fold action was detected, to update the state in response to a fold occurring.
Definition: Worksheet.cpp:1209
void OnMouseCaptureLost(wxMouseCaptureLostEvent &event)
Is called if we loose the mouse connection whilst selecting text/cells.
Definition: Worksheet.cpp:6174
wxTimer & KeyboardInactiveTimer()
The timer that tells us when the keyboard is inactive so an autosave isn't disrupting.
Definition: Worksheet.h:856
ClickType
An enum for all classes of items one can click on.
Definition: Worksheet.h:382
ImgCell * GetSelectedImgCell() const
Returns the selected cell - or NULL, if the selection isn't an image.
Definition: Worksheet.h:1081
Cell * FindCellByUUID(const wxString &uuid)
Find a cell by its UUID.
Definition: Worksheet.cpp:4187
void EraseBackground(wxEraseEvent &event)
Is called if wxWidgets wants to erase the worksheet's background.
Definition: Worksheet.cpp:313
bool CanDeleteSelection() const
Is it possible to delete the currently selected cells?
Definition: Worksheet.h:1064
ToolBar * m_mainToolBar
The toolbar of the main window: We need to access it and therefore have it defined here.
Definition: Worksheet.h:1650
bool CaretVisibleIs()
Is the caret (hcaret or vcaret) currently visible on the worksheet?
Definition: Worksheet.cpp:5345
EditorCell * GetActiveCell() const
Get the currently active EditorCell.
Definition: Worksheet.h:677
bool UpdateControlsNeeded()
Is an update of the worksheet controls needed?
Definition: Worksheet.h:144
bool CopyCells() const
Copy the selection to the clipboard as it would appear in a .wxm file.
Definition: Worksheet.cpp:2054
bool OpenQuestionCaret(const wxString &txt={})
Move the cursor to the question maxima currently asks and if needed add a cell for user input.
Definition: Worksheet.cpp:2281
bool FindIncremental(const wxString &str, bool down, bool ignoreCase, bool searchInInput=true, bool searchInOutput=true)
Do an incremental search from the cursor or the point the last search started at.
Definition: Worksheet.cpp:5186
GroupCell * GetLastCell()
Returns the last cell of the worksheet.
Definition: Worksheet.h:1390
GroupCell * GetHCaret()
The cell the horizontal cursor is above. NULL means at the start of the document.
Definition: Worksheet.cpp:4954
wxString ConvertSelectionToMathML() const
Convert the current selection to MathML.
Definition: Worksheet.cpp:1867
bool CanUndoInsideCell() const
Is it possible to issue an undo in the currently selected cell?
Definition: Worksheet.h:1432
void SetHCaret(GroupCell *where)
Set the HCaret at the location of the given Cell.
Definition: Worksheet.cpp:4981
bool CanRedoInsideCell() const
Is it possible to issue an undo in the currently selected cell?
Definition: Worksheet.h:1440
bool GCContainsCurrentQuestion(const GroupCell *cell)
Does the GroupCell cell points to contain the question currently asked by maxima?
Definition: Worksheet.cpp:2511
bool WillAutoAnswer() const
Execute all collected scroll events in one go.
Definition: Worksheet.cpp:2274
bool IsEmpty() const
Is this worksheet empty?
Definition: Worksheet.h:591
void NumberSections() const
Renumber all sections.
Definition: Worksheet.cpp:1153
void SetViewVirtualSize(int width, int height) override
Set the scrollable (virtual) area, in device pixels.
Definition: Worksheet.h:124
void OnKeyDown(wxKeyEvent &event)
A special key has been pressed.
Definition: Worksheet.cpp:2406
GroupCell * FindGroupCellByUUID(const wxString &uuid) const
Finds a GroupCell by its UUID, or nullptr if no cell has that UUID.
Definition: Worksheet.cpp:959
EditorCell * KeyboardSelectionStart() const
Tells us which cell the keyboard selection has started in.
Definition: Worksheet.h:680
void SetSelection(Cell *sel)
Select the cell sel.
Definition: Worksheet.h:1262
void AddCellToEvaluationQueue(GroupCell *gc)
Schedule this cell for evaluation.
Definition: Worksheet.cpp:4157
void SetCellStyle(GroupCell *group, GroupType style)
Change the style of a cell.
Definition: Worksheet.cpp:2199
bool Autocomplete(AutoComplete::autoCompletionType type=AutoComplete::command)
Definition: Worksheet.cpp:5651
wxBitmap m_memory
A memory we can manually buffer the contents of the area that is to be redrawn in.
Definition: Worksheet.h:1773
void LoadSymbols()
Compile a list of known autocompletion symbols.
Definition: Worksheet.cpp:3800
void SelectGroupCell(GroupCell *cell)
Set this cell as the currently selected one.
Definition: Worksheet.cpp:6076
void ShowPoint(wxPoint point)
Scrolls to a point on the worksheet.
Definition: Worksheet.cpp:4620
void WindowActive(bool active)
Is this window active?
Definition: Worksheet.h:629
bool ExportToTeX(const wxString &file)
export to a LaTeX file
Definition: Worksheet.cpp:3793
void AdjustSize()
Adjust the virtual size and scrollbars; see WorksheetLayout::AdjustSize().
Definition: Worksheet.h:515
void ShowHCaret()
Activates the horizontal cursor.
Definition: Worksheet.cpp:5013
TimerIDs
An enum of individual IDs for all timers this class handles.
Definition: Worksheet.h:392
void CodeCellVisibilityChanged()
To be called after enabling or disabling the visibility of code cells.
Definition: Worksheet.cpp:3781
void ScrollToCaret()
Request to scroll to the cursor as soon as wxMaxima is idle.
Definition: Worksheet.h:1322
void MarkRefreshAsDone()
Handle redrawing the worksheet or of parts of it.
Definition: Worksheet.h:727
bool CopyMathML() const
Copy the MathML representation of the current selection to the clipboard.
Definition: Worksheet.cpp:1935
bool CopyBitmap() const
Copy a bitmap of the current selection to the clipboard.
Definition: Worksheet.cpp:3517
bool CanCopyAsMathML() const
Would "Copy as MathML" of the current selection produce actual math?
Definition: Worksheet.cpp:1916
void GetViewClientSize(int *width, int *height) const override
The visible client area, in device pixels.
Definition: Worksheet.h:120
GroupCell * Fold(GroupCell *which)
Fold a cell (see WorksheetDocument::Fold())
Definition: Worksheet.h:1533
bool PointVisibleIs(wxPoint point)
Is the point currently visible on the worksheet?
Definition: Worksheet.cpp:4599
std::unique_ptr< Cell > CopySelection(bool asData=false) const
Copy the currently selected cells.
Definition: Worksheet.cpp:3693
GroupCell * GetLastCellInWorksheet() const
Returns a pointer to the last cell of this worksheet.
Definition: Worksheet.cpp:1669
void ScrollToStart()
Scroll to the start of the worksheet.
Definition: Worksheet.h:803
void NotifyRecalculation(GroupCell *start) override
Schedule a re-layout of the document starting at start (null = all).
Definition: Worksheet.h:132
void AddSymbol(const wxString &fun, AutoComplete::autoCompletionType type=AutoComplete::command)
Add a symbol to the autocompletion list.
Definition: Worksheet.h:1630
bool CanEdit() const
We can edit the input if the we have the whole input in selection!
Definition: Worksheet.h:1275
bool FindNext(const wxString &str, bool down, bool ignoreCase, bool searchInInput=true, bool searchInOutput=true, bool warn=true)
Find the next occurrence of a string.
Definition: Worksheet.cpp:5279
bool SectioningMoveIn(GroupCell *parent)
Make this chapter/section/... a section/subsection/... changing its subheadings, too.
Definition: Worksheet.cpp:5943
wxBitmap ConvertSelectionToBitmap() const
Convert the current selection to a bitmap.
void RequestRedraw(GroupCell *start=NULL)
Request the worksheet to be redrawn.
Definition: Worksheet.cpp:482
bool RedrawIfRequested()
Redraw the worksheet if RequestRedraw() has been called.
Definition: Worksheet.cpp:325
bool ExportToMAC(const wxString &file)
Export the file to a text file maxima's load command can read.
Definition: Worksheet.cpp:3926
void SetActiveCell(EditorCell *cell)
Mark an editor cell as the active one.
Definition: Worksheet.cpp:4515
FindReplaceDialog * m_findDialog
The find-and-replace-dialog.
Definition: Worksheet.h:809
void DrawGroupCell(wxDC &dc, wxDC &adc, GroupCell &cell)
Draws a groupcell on the DC.
Definition: Worksheet.cpp:821
void QuestionAnswered()
Mark the current question from maxima as "answered"..
Definition: Worksheet.cpp:2515
void DeleteRegion(GroupCell *start, GroupCell *end, UndoActions *undoBuffer)
Definition: Worksheet.cpp:2230
bool ScrollToCaretIfNeeded()
Scrolls to the cursor, if requested.
Definition: Worksheet.cpp:5379
void NotifyRedraw(GroupCell *start) override
Schedule a redraw of the document starting at start (null = all).
Definition: Worksheet.h:134
std::unique_ptr< GroupCell > CopyTree() const
Copies the worksheet's entire contents.
Definition: Worksheet.cpp:3513
GroupCell * EndOfSectioningUnit(GroupCell *start)
Finds the end of the current chapter/section/...
Definition: Worksheet.cpp:2556
std::vector< wxString > m_replacementsForCurrentWord
Suggestions for how the word that was right-clicked on could continue.
Definition: Worksheet.h:1716
int ExportSelectionOutputToDir(const wxString &dir, bool svg)
Write each selected group cell's output to an image file in a folder.
Definition: Worksheet.cpp:3638
void ForceRedraw()
Redraw the window now and mark any pending redraw request as "handled".
Definition: Worksheet.h:764
bool CopyTeX() const
Copy the TeX representation of the current selection to the clipboard.
Definition: Worksheet.cpp:1990
void AddRestToEvaluationQueue()
Add all cells below the cursor to the evaluation queue.
Definition: Worksheet.cpp:4103
void ScrollToCellIfNeeded()
Scrolls to the cell given by ScheduleScrollToCell; Is called once we have time to do so.
Definition: Worksheet.cpp:4209
void DrawGroupCell_UsingBitmap(wxDC *dc, GroupCell *cell)
Draws a groupcell in a bitmap and then blits it onto the DC.
Definition: Worksheet.cpp:770
void GetMaxPoint(int *width, int *height)
Get the coordinates of the bottom right point of the worksheet.
Definition: Worksheet.h:412
void OnMouseWheel(wxMouseEvent &event)
Called if the mouse wheel sents events.
Definition: Worksheet.cpp:1556
void RequestRecalculation()
Schedule a recalculation of the whole worksheet.
Definition: Worksheet.h:977
void CloseAutoCompletePopup()
Close the autocompletion pop-up if it is currently open.
Definition: Worksheet.h:594
bool SectioningMoveOut(GroupCell *parent)
Make this section/subsection/... a chapter/section/... changing its subheadings, too.
Definition: Worksheet.cpp:5985
bool FollowEvaluation() const
Query if we want to automatically scroll to the cell that is currently evaluated.
Definition: Worksheet.h:1456
void DestroyTree()
Clear the whole worksheet.
Definition: Worksheet.cpp:3504
wxString GetString(bool lb=false) const
Convert the current selection to a string.
Definition: Worksheet.cpp:1763
void NotifySavedStateChanged() override
The document's saved-state flipped; refresh the controls that show it.
Definition: Worksheet.h:136
int GetLastCellsVisited() const
How many cells the last layout pass visited. See WorksheetLayout.
Definition: Worksheet.h:980
std::unique_ptr< wxDataObject > CreateSelectionDataObject() const
Build the multi-format clipboard object for a non-cell selection.
Definition: Worksheet.cpp:1810
GroupCell * GetWorkingGroup(bool resortToLast=false) const
Returns the cell maxima currently works on.
Definition: Worksheet.cpp:937
bool CopySVG() const
Copy a svg of the current selection to the clipboard.
Definition: Worksheet.cpp:3532
void Evaluate()
Trigger the evaluation of the current cell(s)
Definition: Worksheet.cpp:2397
void OnScrollChanged(wxScrollEvent &ev)
Called if the user is using the scrollbar for scrolling through the document.
Definition: Worksheet.cpp:5112
void OnDoubleClick(wxMouseEvent &event)
Is called on double click on a cell.
Definition: Worksheet.cpp:4002
void OnActivate(wxActivateEvent &event)
Is called if this element looses or gets the focus.
Definition: Worksheet.cpp:4973
void AddToEvaluationQueue(GroupCell *cell)
Adds a group cell to the evaluation queue marking its contents as "outdated".
Definition: Worksheet.cpp:4078
void RequestRecalculation(Cell *start)
Schedule a recalculation of the worksheet starting with the cell start.
Definition: Worksheet.h:966
void AnonymizeCodeCells()
Anonymize the code cells in the current selection for a bug report (GH #1339).
Definition: Worksheet.cpp:5527
Definition: CellPointers.h:32
bool CanTreeRedo() const
Can we redo a tree operation?
Definition: Worksheet.cpp:4328
void TreeUndo_CellEntered()
The cursor has entered one cell => save the value to see if it has changed.
Definition: Worksheet.cpp:2190
void TreeUndo_AppendAction()
Add another action to this undo action.
Definition: Worksheet.h:309
bool TreeUndoTextChange(UndoActions *sourcelist, UndoActions *undoForThisOperation)
Undo a text change.
Definition: Worksheet.cpp:4420
bool TreeUndo()
Undo a tree operation.
Definition: Worksheet.h:336
void TreeUndo_ClearRedoActionList()
Clear the list of actions for which an undo can be undone.
Definition: Worksheet.h:303
bool CanTreeUndo() const
Can we undo a tree operation?
Definition: Worksheet.cpp:4324
void TreeUndo_CellLeft()
The cursor is about to leave the current cell => Store the change if the value has changed.
Definition: Worksheet.cpp:2175
void TreeUndo_ClearUndoActionList()
Clear the list of actions for which undo can undo.
Definition: Worksheet.h:306
bool TreeUndoCellAddition(UndoActions *sourcelist, UndoActions *undoForThisOperation)
Undo adding cells.
Definition: Worksheet.cpp:4356
bool TreeUndoCellDeletion(UndoActions *sourcelist, UndoActions *undoForThisOperation)
Undo a call deletion.
Definition: Worksheet.cpp:4343
bool TreeRedo()
Redo an undone tree operation.
Definition: Worksheet.h:340
void TreeUndo_MarkCellsAsAdded(GroupCell *start, GroupCell *end, UndoActions *undoBuffer)
Remember that these cells were just added so this addition can be undone.
Definition: Worksheet.cpp:2166
bool TreeUndoFold(UndoActions *sourcelist, UndoActions *undoForThisOperation)
Undo a fold or unfold (GH #266)
Definition: Worksheet.cpp:4391
Where a search starts: a group plus what the cursor is doing there.
Definition: WorksheetSearch.h:113
A search match: the group it is in and the matching part.
Definition: WorksheetSearch.h:97