Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
WordProcessor.h
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#ifndef _Stroika_Frameworks_Led_WordProcessor_h_
5#define _Stroika_Frameworks_Led_WordProcessor_h_ 1
6
7#include "Stroika/Frameworks/StroikaPreComp.h"
8
9/*
10@MODULE: WordProcessor
11@DESCRIPTION:
12 <p>This module contains all the classes needed to implement a typical
13 word-processor UI. These things include per-paragraph tab stops, justification,
14 margins, etc. The main class you should be interested in is the @'WordProcessor' class.
15 </p>
16 */
17
18#include "Stroika/Frameworks/Led/HiddenText.h"
19#include "Stroika/Frameworks/Led/IdleManager.h"
20#include "Stroika/Frameworks/Led/MarkerCover.h"
21#include "Stroika/Frameworks/Led/StandardStyledTextInteractor.h"
22#include "Stroika/Frameworks/Led/TextInteractorMixins.h"
23#include "Stroika/Frameworks/Led/WordWrappedTextInteractor.h"
24
25namespace Stroika::Frameworks::Led {
26
27 class IncrementalParagraphInfo;
28 class WordProcessorTable;
29
30 constexpr inline TWIPS kBadCachedFarthestRightMarginInDocument = TWIPS (-1);
31
32 /**
33 * Currently (as of 2024-02-14) tightly coupled with GDI code, so conditionally disable table support if we dont have GDI support.
34 */
35#ifndef qStroika_Frameworks_Led_SupportTables
36#define qStroika_Frameworks_Led_SupportTables qStroika_Frameworks_Led_SupportGDI
37#endif
38
39 /**
40 * An object which captures the per-paragraph information we store especially in the
41 * @'WordProcessor' class. The attributes stored include:
42 * <ul>
43 * <li>Justification</li>
44 * <li>TabStopList</li>
45 * <li>Margin (left and right - NB: we require left < right)</li>
46 * <li>FirstIdent (nb this is ADDED to the LHS margin, and CAN BE NEGATIVE</li>
47 * </ul>
48 */
50 public:
51 constexpr ParagraphInfo () = default;
52
53 public:
54 nonvirtual Justification GetJustification () const;
55 nonvirtual void SetJustification (Justification justification);
56
57 private:
58 Justification fJustification{eLeftJustify};
59
60 public:
61 nonvirtual const StandardTabStopList& GetTabStopList () const;
62 nonvirtual void SetTabStopList (const StandardTabStopList& tabStops);
63
64 private:
65 StandardTabStopList fTabStops{};
66
67 public:
68 nonvirtual TWIPS GetLeftMargin () const;
69 nonvirtual TWIPS GetRightMargin () const;
70 nonvirtual void SetMargins (TWIPS lhs, TWIPS rhs);
71
72 private:
73 TWIPS fLeftMargin{0};
74 TWIPS fRightMargin{1};
75
76 public:
77 nonvirtual TWIPS GetFirstIndent () const;
78 nonvirtual void SetFirstIndent (TWIPS firstIndent);
79
80 private:
81 TWIPS fFirstIndent{0};
82
83 public:
84 nonvirtual TWIPS GetSpaceBefore () const;
85 nonvirtual void SetSpaceBefore (TWIPS sb);
86 nonvirtual TWIPS GetSpaceAfter () const;
87 nonvirtual void SetSpaceAfter (TWIPS sa);
88 nonvirtual LineSpacing GetLineSpacing () const;
89 nonvirtual void SetLineSpacing (LineSpacing sl);
90
91 private:
92 TWIPS fSpaceBefore{0};
93 TWIPS fSpaceAfter{0};
94 LineSpacing fLineSpacing{};
95
96 public:
97 nonvirtual ListStyle GetListStyle () const;
98 nonvirtual void SetListStyle (ListStyle listStyle);
99
100 private:
101 ListStyle fListStyle{eListStyle_None};
102
103 public:
104 nonvirtual unsigned char GetListIndentLevel () const;
105 nonvirtual void SetListIndentLevel (unsigned char indentLevel);
106
107 private:
108 unsigned char fListIndentLevel{0};
109
110 public:
111 nonvirtual void MergeIn (const IncrementalParagraphInfo& incParaInfo);
112
113 public:
114 constexpr bool operator== (const ParagraphInfo&) const = default;
115 };
116
117 /**
118 * Overload (hide) the @'WordProcessor::ParagraphInfo' methods, to assert that the
119 * attribute is valid (for getters) and to set a ValidFlag for the setters. And add methods for
120 * each attribute to test for validity, and to invalidate.</p>
121 * <p>These are used if you want to set just part of a @'WordProcessor::ParagraphInfo'.</p>
122 *
123 * @todo REDO using:
124 * optioanl of each ParagraphInfo fields
125 * no subclass - instead conversion operator to ParagraphInfo (with defaults for stuff not specified?)
126 */
128 private:
129 using inherited = ParagraphInfo;
130
131 public:
133 explicit IncrementalParagraphInfo (const ParagraphInfo& pi);
134
135 public:
136 nonvirtual Justification GetJustification () const;
137 nonvirtual void SetJustification (Justification justification);
138 nonvirtual bool GetJustification_Valid () const;
139 nonvirtual void InvalidateJustification ();
140
141 private:
142 bool fJustificationValid;
143
144 public:
145 nonvirtual const StandardTabStopList& GetTabStopList () const;
146 nonvirtual void SetTabStopList (const StandardTabStopList& tabStops);
147 nonvirtual bool GetTabStopList_Valid () const;
148 nonvirtual void InvalidateTabStopList ();
149
150 private:
151 bool fTabStopListValid;
152
153 public:
154 nonvirtual TWIPS GetLeftMargin () const;
155 nonvirtual TWIPS GetRightMargin () const;
156 nonvirtual void SetMargins (TWIPS lhs, TWIPS rhs);
157 nonvirtual bool GetMargins_Valid () const;
158 nonvirtual void InvalidateMargins ();
159
160 private:
161 bool fMarginsValid;
162
163 public:
164 nonvirtual TWIPS GetFirstIndent () const;
165 nonvirtual void SetFirstIndent (TWIPS firstIndent);
166 nonvirtual bool GetFirstIndent_Valid () const;
167 nonvirtual void InvalidateFirstIndent ();
168
169 private:
170 bool fFirstIndentValid;
171
172 public:
173 nonvirtual TWIPS GetSpaceBefore () const;
174 nonvirtual void SetSpaceBefore (TWIPS sb);
175 nonvirtual bool GetSpaceBefore_Valid () const;
176 nonvirtual void InvalidateSpaceBefore ();
177 nonvirtual TWIPS GetSpaceAfter () const;
178 nonvirtual void SetSpaceAfter (TWIPS sa);
179 nonvirtual bool GetSpaceAfter_Valid () const;
180 nonvirtual void InvalidateSpaceAfter ();
181 nonvirtual LineSpacing GetLineSpacing () const;
182 nonvirtual void SetLineSpacing (LineSpacing sl);
183 nonvirtual bool GetLineSpacing_Valid () const;
184 nonvirtual void InvalidateLineSpacing ();
185
186 nonvirtual ListStyle GetListStyle () const;
187 nonvirtual void SetListStyle (ListStyle listStyle);
188 nonvirtual bool GetListStyle_Valid () const;
189 nonvirtual void InvalidateListStyle ();
190
191 nonvirtual unsigned char GetListIndentLevel () const;
192 nonvirtual void SetListIndentLevel (unsigned char indentLevel);
193 nonvirtual bool GetListIndentLevel_Valid () const;
194 nonvirtual void InvalidateListIndentLevel ();
195
196 private:
197 bool fSpaceBeforeValid;
198 bool fSpaceAfterValid;
199 bool fLineSpacingValid;
200 bool fListStyleValid;
201 bool fListIndentLevelValid;
202
203 public:
204 nonvirtual bool operator== (const IncrementalParagraphInfo& rhs) const;
205 };
206
207 /**
208 */
209 class AbstractParagraphDatabaseRep : public virtual MarkerOwner {
210 private:
211 using inherited = MarkerOwner;
212
213 public:
214 AbstractParagraphDatabaseRep ();
215
216 public:
217 virtual shared_ptr<Partition> GetPartition () const = 0;
218 virtual void SetPartition (const shared_ptr<Partition>& partitionPtr) = 0;
219
220 public:
221 virtual const ParagraphInfo& GetParagraphInfo (size_t charAfterPos) const = 0;
222 virtual vector<pair<ParagraphInfo, size_t>> GetParagraphInfo (size_t charAfterPos, size_t nTCharsFollowing) const = 0;
223
224 virtual void SetParagraphInfo (size_t charAfterPos, size_t nTCharsFollowing, const IncrementalParagraphInfo& infoForMarkers) = 0;
225 virtual void SetParagraphInfo (size_t charAfterPos, const vector<pair<IncrementalParagraphInfo, size_t>>& infoForMarkers) = 0;
226 virtual void SetParagraphInfo (size_t charAfterPos, const vector<pair<ParagraphInfo, size_t>>& infoForMarkers) = 0;
227
228 private:
229 bool fSomeInvalidTables;
230
231 protected:
232 TWIPS fCachedFarthestRightMarginInDocument;
233
234 private:
235 friend class WordProcessor;
236 friend class WordProcessorTable;
237 };
238
239 /**
240 */
241 class ParagraphInfoMarker : public Marker {
242 public:
243 ParagraphInfoMarker (ParagraphInfo paragraphInfo = {});
244
245 nonvirtual const ParagraphInfo& GetInfo () const;
246 nonvirtual void SetInfo (ParagraphInfo paragraphInfo);
247
248 private:
249 ParagraphInfo fParagraphInfo;
250 };
251
252 DISABLE_COMPILER_MSC_WARNING_START (4250) // inherits via dominance warning
253 /**
254 * <p>A MarkerCover which associates @'WordProcessor::ParagraphInfo' with each paragraph in the next (merging together adjacent
255 * identical ones). Paragraphs are defined by the @'Partition' object associated
256 * (@'WordProcessor::ParagraphDatabaseRep::SetPartition').</p>
257 */
258 class ParagraphDatabaseRep : public AbstractParagraphDatabaseRep, private MarkerCover<ParagraphInfoMarker, ParagraphInfo, IncrementalParagraphInfo> {
259 private:
260 using inheritedMC = MarkerCover<ParagraphInfoMarker, ParagraphInfo, IncrementalParagraphInfo>;
261
262 public:
263 using PartitionMarker = Partition::PartitionMarker;
264
265 public:
266 ParagraphDatabaseRep (TextStore& textStore);
267
268 public:
269 virtual shared_ptr<Partition> GetPartition () const override;
270 virtual void SetPartition (const shared_ptr<Partition>& partitionPtr) override;
271
272 private:
273 shared_ptr<Partition> fPartition;
274
275 public:
276 static ParagraphInfo GetStaticDefaultParagraphInfo ();
277
278 // override the AbstractParagraphDatabase API
279 public:
280 virtual const ParagraphInfo& GetParagraphInfo (size_t charAfterPos) const override;
281 virtual vector<pair<ParagraphInfo, size_t>> GetParagraphInfo (size_t charAfterPos, size_t nTCharsFollowing) const override;
282 virtual void SetParagraphInfo (size_t charAfterPos, size_t nTCharsFollowing, const IncrementalParagraphInfo& infoForMarkers) override;
283 virtual void SetParagraphInfo (size_t charAfterPos, const vector<pair<IncrementalParagraphInfo, size_t>>& infoForMarkers) override;
284 virtual void SetParagraphInfo (size_t charAfterPos, const vector<pair<ParagraphInfo, size_t>>& infoForMarkers) override;
285
286 public:
287 virtual void SetInfo (size_t charAfterPos, size_t nTCharsFollowing, const IncrementalParagraphInfo& infoForMarkers) override;
288 virtual void SetInfos (size_t charAfterPos, const vector<pair<IncrementalParagraphInfo, size_t>>& infoForMarkers) override;
289
290 protected:
291 virtual void NoteCoverRangeDirtied (size_t from, size_t to, const MarkerVector& rangeAndSurroundingsMarkers) override;
292 virtual void ConstrainSetInfoArgs (size_t* charAfterPos, size_t* nTCharsFollowing) override;
293
294 private:
295 nonvirtual void CheckMarkerBounaryConstraints (size_t from, size_t to) noexcept;
296 nonvirtual void CheckMarkerBounaryConstraints (const MarkerVector& rangeAndSurroundingsMarkers) noexcept;
297
298#if qStroika_Foundation_Debug_AssertionsChecked
299 protected:
300 virtual void Invariant_ () const override;
301#endif
302 };
303 DISABLE_COMPILER_MSC_WARNING_END (4250) // inherits via dominance warning
304
305 /*
306 @CLASS: WordProcessorTable
307 @BASES: @'SimpleEmbeddedObjectStyleMarker'
308 @DESCRIPTION: <p>A table is an object that can be embedded in a document, and it contains multiple cells.
309 Each cell is basically another word-processor instance.</p>
310 <p>Since a table is assocated with a paragraph database, and can be viewed and edited
311 simultaneously be multiple views (WordProcessors) - we cannot make long-term assumptions
312 about association of a table with an owning WordProcessor object. Instead - during UI operations
313 like typing and so on - you temporarily associate an owning WP with the given table using
314 @'WordProcessorTable::TemporarilySetOwningWP'</p>
315 <p>We support having any number of rows, and each row can have a different number of
316 columns (cells). Often however - the number of columns for each row of a table will be the
317 same (as will their widths be equal).</p>
318 <p>This class may not remain a subclass of simpleembeddedObject stuff - but maybe.</p>
319 <p>Note that most coordiantes in this routine are presumed to be table relative. Either that - or
320 they are window-rect relative. You can use the methods @'WordProcessorTable::TableCoordinates2Window' and
321 @'WordProcessorTable::WindowCoordinates2Table' to map between them.
322 </p>
323 <p>Each cell is surrounded by spacing (see @'WordProcessorTable::GetCellSpacing'.
324 This defaults to zero. If you set it to non-zero - then the borders drawn for cells don't touch the
325 borders for the table itself.</p>
326 <p>The cell bounds for each cell (@'WordProcessorTable::GetCellBounds') is the area that
327 gets a box drawn around it (on the outside bounds). These 'cell bounds' may not exactly touch each other on the
328 edges by so that they SHARE the border separating each from its sibling. Also - they may not touch because
329 of cell spacing (@'WordProcessorTable::GetCellSpacing').</p>
330 <p>The actual 'edit window' within a cell is inset by its cell margins. This value defaults
331 to that provided by @'WordProcessorTable::GetDefaultCellMargins', but at some point (maybe for 3.1?)
332 will be overridable on a per-cell basis.</p>
333 */
334 class WordProcessorTable
335#if qStroika_Frameworks_Led_SupportGDI
336 : public SimpleEmbeddedObjectStyleMarker
337#else
338 : public StyleMarker
339#endif
340 {
341 private:
342#if qStroika_Frameworks_Led_SupportGDI
343 using inherited = SimpleEmbeddedObjectStyleMarker;
344#else
345 using inherited = StyleMarker;
346#endif
347
348 public:
349 WordProcessorTable (AbstractParagraphDatabaseRep* tableOwner, size_t addAt);
350 ~WordProcessorTable ();
351
352#if qStroika_Frameworks_Led_SupportGDI
353 public:
354 using CursorMovementDirection = TextImager::CursorMovementDirection;
355 using CursorMovementUnit = TextImager::CursorMovementUnit;
356 using UpdateMode = TextInteractor::UpdateMode;
357 using CursorMovementAction = TextInteractor::CursorMovementAction;
358 using CommandUpdater = TextInteractor::CommandUpdater;
359 using CommandNumber = TextInteractor::CommandNumber;
360#endif
361
362 protected:
363 virtual void FinalizeAddition (AbstractParagraphDatabaseRep* o, size_t addAt);
364
365 public:
366 class Cell;
367
368 protected:
369 class CellRep;
370
371#if qStroika_Frameworks_Led_SupportGDI
372 public:
373 virtual void DrawSegment (const StyledTextImager* imager, const StyleRunElement& runElement, Tablet* tablet, size_t from, size_t to,
374 const TextLayoutBlock& text, const Led_Rect& drawInto, const Led_Rect& invalidRect,
375 CoordinateType useBaseLine, DistanceType* pixelsDrawn) override;
376 virtual void MeasureSegmentWidth (const StyledTextImager* imager, const StyleRunElement& runElement, size_t from, size_t to,
377 const Led_tChar* text, DistanceType* distanceResults) const override;
378 virtual DistanceType MeasureSegmentHeight (const StyledTextImager* imager, const StyleRunElement& runElement, size_t from, size_t to) const override;
379
380 public:
381 virtual vector<Led_Rect> GetRowHilightRects () const;
382
383 protected:
384 virtual void DrawTableBorders (WordProcessor& owningWP, Tablet* tablet, const Led_Rect& drawInto);
385 virtual void DrawCellBorders (Tablet* tablet, size_t row, size_t column, const Led_Rect& cellBounds);
386#endif
387
388 public:
389 nonvirtual TWIPS GetCellSpacing () const;
390 nonvirtual void SetCellSpacing (TWIPS cellSpacing);
391
392 private:
393 TWIPS fCellSpacing{TWIPS{0}};
394
395 public:
396 nonvirtual void GetDefaultCellMargins (TWIPS* top, TWIPS* left, TWIPS* bottom, TWIPS* right) const;
397 nonvirtual void SetDefaultCellMargins (TWIPS top, TWIPS left, TWIPS bottom, TWIPS right);
398
399 private:
400 // Not REALLY a rect - just a handy way to store 4 values... and OK since its private - not part of API
401 // LHS and RHS both 90 TWIPS (tricky CTOR - last arg is WIDTH - not RHS).
402 TWIPS_Rect fDefaultCellMargins{TWIPS (15), TWIPS (90), TWIPS{0}, TWIPS{0}};
403
404#if qStroika_Frameworks_Led_SupportGDI
405 public:
406 virtual Led_Rect GetCellBounds (size_t row, size_t column) const;
407 virtual Led_Rect GetCellEditorBounds (size_t row, size_t column) const;
408
409 virtual void GetClosestCell (const Led_Point& p, size_t* row, size_t* col) const;
410
411 public:
412 nonvirtual Led_Point TableCoordinates2Window (const Led_Point& p) const;
413 nonvirtual Led_Rect TableCoordinates2Window (const Led_Rect& r) const;
414 nonvirtual Led_Point WindowCoordinates2Table (const Led_Point& p) const;
415 nonvirtual Led_Rect WindowCoordinates2Table (const Led_Rect& r) const;
416
417 public:
418 virtual bool GetCaretShownSituation () const;
419 virtual Led_Rect CalculateCaretRect () const;
420
421 public:
422 virtual bool OnTypedNormalCharacter (Led_tChar theChar, bool optionPressed, bool shiftPressed, bool commandPressed,
423 bool controlPressed, bool altKeyPressed);
424
425 protected:
426 virtual bool DoSingleCharCursorEdit (CursorMovementDirection direction, CursorMovementUnit movementUnit,
427 CursorMovementAction action, UpdateMode updateMode, bool scrollToSelection);
428
429 public:
430 virtual bool OnUpdateCommand (CommandUpdater* enabler);
431 virtual bool OnPerformCommand (CommandNumber commandNumber);
432
433 protected:
434 nonvirtual void BreakInGroupedCommands ();
435
436 protected:
437 virtual bool OnUpdateCommand_ApplyToEachSelectedCell (CommandUpdater* enabler);
438 virtual bool OnPerformCommand_ApplyToEachSelectedCell (CommandNumber commandNumber, bool captureChangesForUndo = true);
439
440 public:
441 virtual void OnUpdateCutCommand (CommandUpdater* pCmdUI);
442 virtual void OnCutCommand ();
443 virtual void OnUpdateInsertTableRowAboveCommand (CommandUpdater* pCmdUI);
444 virtual void OnInsertTableRowAboveCommand ();
445 virtual void OnUpdateInsertTableRowBelowCommand (CommandUpdater* pCmdUI);
446 virtual void OnInsertTableRowBelowCommand ();
447 virtual void OnUpdateInsertTableColBeforeCommand (CommandUpdater* pCmdUI);
448 virtual void OnInsertTableColBeforeCommand ();
449 virtual void OnUpdateInsertTableColAfterCommand (CommandUpdater* pCmdUI);
450 virtual void OnInsertTableColAfterCommand ();
451 virtual void OnUpdateRemoveTableRowsCommand (CommandUpdater* pCmdUI);
452 virtual void OnRemoveTableRowsCommand ();
453 virtual void OnUpdateRemoveTableColumnsCommand (CommandUpdater* pCmdUI);
454 virtual void OnRemoveTableColumnsCommand ();
455 virtual void OnUpdateSelectTablePartsCommand (CommandUpdater* enabler);
456 virtual void OnPerformTablePartsCommand (CommandNumber commandNumber);
457
458 protected:
459 nonvirtual void AssureCurSelFontCacheValid (IncrementalFontSpecification* curSelFontSpec);
460
461 public:
462 nonvirtual void InteractiveSetFont (const IncrementalFontSpecification& defaultFont);
463
464 // SimpleEmbeddedObjectStyleMarker overrides
465 public:
466 virtual const char* GetTag () const override;
467 virtual void Write (SinkStream& sink) override;
468 virtual void ExternalizeFlavors (WriterFlavorPackage& flavorPackage) override;
469
470 public:
471 virtual bool ProcessSimpleClick (Led_Point clickedAt, unsigned clickCount, bool extendSelection);
472 virtual void WhileSimpleMouseTracking (Led_Point newMousePos);
473#endif
474
475 public:
476 nonvirtual Color GetTableBorderColor () const;
477 nonvirtual void SetTableBorderColor (Color c);
478
479 public:
480 nonvirtual TWIPS GetTableBorderWidth () const;
481 nonvirtual void SetTableBorderWidth (TWIPS w);
482
483 public:
484 nonvirtual TWIPS GetColumnWidth (size_t row, size_t column) const;
485 nonvirtual void SetColumnWidth (size_t row, size_t column, TWIPS colWidth);
486
487 public:
488 nonvirtual Color GetCellColor (size_t row, size_t column) const;
489 nonvirtual void SetCellColor (size_t row, size_t column, const Color& c);
490
491 public:
492 nonvirtual Cell& GetCell (size_t row, size_t column);
493 nonvirtual const Cell& GetCell (size_t row, size_t column) const;
494 nonvirtual void GetRealCell (size_t* row, size_t* column) const;
495 nonvirtual const Cell& GetRealCell (size_t row, size_t column) const;
496
497 public:
498 enum CellMergeFlags {
499 ePlainCell = 0,
500 eMergeCellLeft = 1,
501 eMergeCellUp = 2,
502 eMergeCellLeftUp = eMergeCellLeft + eMergeCellUp,
503 eInvalidCell = 99
504 };
505
506 public:
507 nonvirtual CellMergeFlags GetCellFlags (size_t row, size_t column) const;
508 nonvirtual bool CanMergeCells (size_t fromRow, size_t fromCol, size_t toRow, size_t toCol);
509 nonvirtual void MergeCells (size_t fromRow, size_t fromCol, size_t toRow, size_t toCol);
510 nonvirtual void UnMergeCells (size_t fromRow, size_t fromCol, size_t toRow, size_t toCol);
511
512 public:
513 nonvirtual void GetCellSelection (size_t* rowSelStart, size_t* rowSelEnd, size_t* colSelStart, size_t* colSelEnd) const;
514 nonvirtual void SetCellSelection (size_t rowSelStart, size_t rowSelEnd, size_t colSelStart, size_t colSelEnd);
515
516 public:
517 nonvirtual bool GetIntraCellMode (size_t* row = nullptr, size_t* col = nullptr) const;
518 nonvirtual void SetIntraCellMode ();
519 nonvirtual void SetIntraCellMode (size_t row, size_t col);
520 nonvirtual void UnSetIntraCellMode ();
521 nonvirtual void GetIntraCellSelection (size_t* selStart, size_t* selEnd) const;
522 nonvirtual void SetIntraCellSelection (size_t selStart, size_t selEnd);
523
524 private:
525 size_t fRowSelStart{0};
526 size_t fRowSelEnd{0};
527 size_t fColSelStart{0};
528 size_t fColSelEnd{0};
529
530 private:
531 bool fIntraCellMode{false};
532 size_t fIntraSelStart{0};
533 size_t fIntraSelEnd{0};
534 size_t fIntraCellDragAnchor{0};
535
536 protected:
537 nonvirtual void SaveIntraCellContextInfo (bool leftSideOfSelectionInteresting, const FontSpecification& intraCellSelectionEmptySelFontSpecification);
538 nonvirtual bool RestoreIntraCellContextInfo (bool* leftSideOfSelectionInteresting, FontSpecification* intraCellSelectionEmptySelFontSpecification);
539 nonvirtual void InvalidateIntraCellContextInfo ();
540
541 private:
542 bool fSavedLeftSideOfSelectionInteresting{false};
543 FontSpecification fSavedIntraCellSelectionEmptySelFontSpecification{};
544 bool fSavedIntraCellInfoValid{false};
545
546 private:
547 size_t fTrackingAnchor_Row{0};
548 size_t fTrackingAnchor_Col{0};
549
550 private:
551 class SuppressCellUpdatePropagationContext;
552 bool fSuppressCellUpdatePropagationContext{false};
553
554 protected:
555 class AllowUpdateInfoPropagationContext;
556 bool fAllowUpdateInfoPropagationContext;
557 TextStore::SimpleUpdater* fCellUpdatePropationUpdater{nullptr};
558
559#if qStroika_Frameworks_Led_SupportGDI
560 protected:
561 class EmbeddedTableWordProcessor;
562
563 protected:
564 virtual EmbeddedTableWordProcessor* ConstructEmbeddedTableWordProcessor (WordProcessor& forWordProcessor, size_t forRow, size_t forColumn,
565 const Led_Rect& cellWindowRect, bool captureChangesForUndo);
566 virtual void ReleaseEmbeddedTableWordProcessor (EmbeddedTableWordProcessor* e);
567#endif
568
569 public:
570 virtual void GetCellWordProcessorDatabases (size_t row, size_t column, TextStore** ts,
571 shared_ptr<AbstractStyleDatabaseRep>* styleDatabase = nullptr,
572 shared_ptr<AbstractParagraphDatabaseRep>* paragraphDatabase = nullptr,
573 shared_ptr<HidableTextMarkerOwner>* hidableTextDatabase = nullptr);
574
575#if qStroika_Frameworks_Led_SupportGDI
576 private:
577 WordProcessor* fCurrentOwningWP{nullptr};
578 class TemporarilySetOwningWP;
579 class TemporarilyAllocateCellWP;
580 class TemporarilyAllocateCellWithTablet;
581#endif
582
583 protected:
584 nonvirtual void InvalidateLayout ();
585#if qStroika_Frameworks_Led_SupportGDI
586 virtual void PerformLayout ();
587#endif
588
589 private:
590 enum LayoutFlag {
591 eDone,
592 eNeedFullLayout
593 };
594 mutable LayoutFlag fNeedLayout{eNeedFullLayout};
595
596 public:
597 nonvirtual size_t GetRowCount () const;
598 nonvirtual size_t GetColumnCount () const;
599
600 public:
601 nonvirtual size_t GetColumnCount (size_t row) const;
602 nonvirtual size_t GetColumnCount (size_t rowStart, size_t rowEnd) const;
603 nonvirtual void SetColumnCount (size_t row, size_t columns);
604
605 public:
606 nonvirtual void GetDimensions (size_t* rows, size_t* columns) const;
607 virtual void SetDimensions (size_t rows, size_t columns);
608 nonvirtual void SetDimensionsAtLeast (size_t rows, size_t columns);
609 virtual void InsertRow (size_t at, size_t maxRowCopyCount = 0xffffffff);
610 virtual void DeleteRow (size_t at);
611 virtual void InsertColumn (size_t at);
612 virtual void DeleteColumn (size_t at);
613
614#if qStroika_Frameworks_Led_SupportGDI
615 protected:
616 virtual void ReValidateSelection ();
617#endif
618
619 protected:
620 /*
621 @CLASS: WordProcessorTable::RowInfo
622 @DESCRIPTION:
623 <p></p>
624 */
625 struct RowInfo {
626 public:
627 RowInfo () = default;
628
629 public:
630 vector<Cell> fCells;
631
632 public:
633 DistanceType fHeight{0}; // height of the cell itself (not including the border)
634 };
635 vector<RowInfo> fRows;
636
637 private:
638#if qStroika_Frameworks_Led_SupportGDI
639 TWIPS fBorderWidth{Led_CvtScreenPixelsToTWIPSH (1)};
640#else
641 TWIPS fBorderWidth{1};
642#endif
643 Color fBorderColor{Color::kSilver};
644 DistanceType fTotalWidth{0};
645 DistanceType fTotalHeight{0};
646
647#if qStroika_Frameworks_Led_SupportGDI
648
649 protected:
650 class SavedTextRepWSel;
651
652 private:
653 class TableCMD;
654
655 private:
656 friend class SuppressCellUpdatePropagationContext;
657 friend class AllowUpdateInfoPropagationContext;
658 friend class TemporarilySetOwningWP;
659 friend class TemporarilyAllocateCellWP;
660 friend class TemporarilyAllocateCellWithTablet;
661 friend class EmbeddedTableWordProcessor;
662 friend class CellRep;
663 friend class TableCMD;
664 // friend class WordProcessor::WPIdler;
665 friend class WordProcessor;
666#endif
667 };
668
669 /*
670 @CLASS: WordProcessorTable::Cell
671 @DESCRIPTION: <p>Used internally by the @'WordProcessorTable' code.</p>
672 */
673 class WordProcessorTable::Cell {
674 public:
675 Cell (WordProcessorTable& forTable, CellMergeFlags mergeFlags);
676
677 public:
678 nonvirtual CellMergeFlags GetCellMergeFlags () const;
679
680 private:
681 CellMergeFlags fCellMergeFlags;
682
683 public:
684 nonvirtual void GetCellWordProcessorDatabases (TextStore** ts, shared_ptr<AbstractStyleDatabaseRep>* styleDatabase = nullptr,
685 shared_ptr<AbstractParagraphDatabaseRep>* paragraphDatabase = nullptr,
686 shared_ptr<HidableTextMarkerOwner>* hidableTextDatabase = nullptr);
687 nonvirtual TextStore& GetTextStore () const;
688 nonvirtual shared_ptr<AbstractStyleDatabaseRep> GetStyleDatabase () const;
689 nonvirtual shared_ptr<AbstractParagraphDatabaseRep> GetParagraphDatabase () const;
690 nonvirtual shared_ptr<HidableTextMarkerOwner> GetHidableTextDatabase () const;
691
692 nonvirtual Color GetBackColor () const;
693 nonvirtual void SetBackColor (Color c);
694
695 nonvirtual TWIPS GetCellXWidth () const;
696 nonvirtual void SetCellXWidth (TWIPS width);
697
698 nonvirtual Led_Rect GetCachedBoundsRect () const;
699 nonvirtual void SetCachedBoundsRect (Led_Rect r);
700
701 public:
702 shared_ptr<CellRep> fCellRep;
703 };
704
705 /*
706 @CLASS: WordProcessorTable::CellRep
707 @DESCRIPTION: <p>Used internally by the @'WordProcessorTable' code.</p>
708 */
709 class WordProcessorTable::CellRep : public MarkerOwner, public Foundation::Memory::UseBlockAllocationIfAppropriate<CellRep> {
710 private:
711 using inherited = MarkerOwner;
712
713 public:
714 CellRep (WordProcessorTable& forTable);
715 ~CellRep ();
716
717 public:
718 virtual TextStore* PeekAtTextStore () const override;
719 virtual void AboutToUpdateText (const UpdateInfo& updateInfo) override;
720 virtual void DidUpdateText (const UpdateInfo& updateInfo) noexcept override;
721
722 public:
723 WordProcessorTable& fForTable;
724 TextStore* fTextStore;
725 shared_ptr<AbstractStyleDatabaseRep> fStyleDatabase;
726 shared_ptr<AbstractParagraphDatabaseRep> fParagraphDatabase;
727 shared_ptr<HidableTextMarkerOwner> fHidableTextDatabase;
728 Color fBackColor;
729 Led_Rect fCachedBoundsRect;
730 TWIPS fCellXWidth;
731 };
732
733 /**
734 * <p>A @'StandardStyledTextInteractor::StandardStyledTextIOSrcStream', for use with the StyledTextIO module,
735 * which adds support for a @'shared_ptr<AbstractParagraphDatabaseRep>'.</p>
736 */
738 private:
740
741 public:
742 WordProcessorTextIOSrcStream (TextStore* textStore, const shared_ptr<AbstractStyleDatabaseRep>& textStyleDatabase,
743 const shared_ptr<AbstractParagraphDatabaseRep>& paragraphDatabase,
744 const shared_ptr<HidableTextMarkerOwner>& hidableTextDatabase, size_t selectionStart = 0,
745 size_t selectionEnd = kBadIndex);
746#if qStroika_Frameworks_Led_SupportGDI
747 WordProcessorTextIOSrcStream (WordProcessor* textImager, size_t selectionStart = 0, size_t selectionEnd = kBadIndex);
748#endif
749
750 public:
751 nonvirtual bool GetUseTableSelection () const;
752 nonvirtual void SetUseTableSelection (bool useTableSelection);
753
754 private:
755 bool fUseTableSelection{false};
756
757 public:
758 virtual Justification GetJustification () const override;
759 virtual StandardTabStopList GetStandardTabStopList () const override;
760 virtual TWIPS GetFirstIndent () const override;
761 virtual void GetMargins (TWIPS* lhs, TWIPS* rhs) const override;
762 virtual TWIPS GetSpaceBefore () const override;
763 virtual TWIPS GetSpaceAfter () const override;
764 virtual LineSpacing GetLineSpacing () const override;
765 virtual void GetListStyleInfo (ListStyle* listStyle, unsigned char* indentLevel) const override;
766 virtual Led_tChar GetSoftLineBreakCharacter () const override;
767 virtual DiscontiguousRun<bool> GetHidableTextRuns () const override;
768#if qStroika_Frameworks_Led_SupportTables
769 virtual SrcStream::Table* GetTableAt (size_t at) const override;
770#endif
771 virtual void SummarizeFontAndColorTable (set<SDKString>* fontNames, set<Color>* colorsUsed) const override;
772
773 protected:
774 class TableIOMapper;
775
776 private:
777 shared_ptr<AbstractParagraphDatabaseRep> fParagraphDatabase;
778 DiscontiguousRun<bool> fHidableTextRuns;
779 };
780
781 /**
782 */
783 class WordProcessorTextIOSrcStream::TableIOMapper : public StyledTextIO::StyledTextIOWriter::SrcStream::Table {
784 private:
785 using inherited = StyledTextIO::StyledTextIOWriter::SrcStream::Table;
786
787 public:
788 TableIOMapper (WordProcessorTable& realTable, size_t startRow = 0, size_t endRow = static_cast<size_t> (-1), size_t startCol = 0,
789 size_t endCol = static_cast<size_t> (-1));
790
791 public:
792 virtual size_t GetRows () const override;
793 virtual size_t GetColumns (size_t row) const override;
794 virtual void GetRowInfo (size_t row, vector<CellInfo>* cellInfos) override;
795 virtual StyledTextIO::StyledTextIOWriter::SrcStream* MakeCellSubSrcStream (size_t row, size_t column) override;
796 virtual size_t GetOffsetEnd () const override;
797 virtual TWIPS_Rect GetDefaultCellMarginsForRow (size_t row) const override;
798 virtual TWIPS_Rect GetDefaultCellSpacingForRow (size_t row) const override;
799
800 private:
801 WordProcessorTable& fRealTable;
802 size_t fStartRow;
803 size_t fEndRow;
804 size_t fStartCol;
805 size_t fEndCol;
806 };
807
808 /**
809 * <p>A @'StandardStyledTextInteractor::StandardStyledTextIOSinkStream', for use with the StyledTextIO module,
810 * which adds support for a @'WordProcessor::shared_ptr<AbstractParagraphDatabaseRep>'.</p>
811 */
813 private:
815
816 public:
817 WordProcessorTextIOSinkStream (TextStore* textStore, const shared_ptr<AbstractStyleDatabaseRep>& textStyleDatabase,
818 const shared_ptr<AbstractParagraphDatabaseRep>& paragraphDatabase,
819 const shared_ptr<HidableTextMarkerOwner>& hidableTextDatabase, size_t insertionStart = 0);
820#if qStroika_Frameworks_Led_SupportGDI
821 WordProcessorTextIOSinkStream (WordProcessor* wp, size_t insertionStart = 0);
822#endif
824
825 private:
826 nonvirtual void CTOR_COMMON ();
827
828 public:
829 nonvirtual bool GetOverwriteTableMode () const;
830 nonvirtual void SetOverwriteTableMode (bool overwriteTableMode);
831
832 private:
833 bool fOverwriteTableMode;
834
835#if !qStroika_Frameworks_Led_NestedTablesSupported
836 public:
837 nonvirtual bool GetNoTablesAllowed () const;
838 nonvirtual void SetNoTablesAllowed (bool noTablesAllowed);
839
840 private:
841 bool fNoTablesAllowed;
842#endif
843
844 public:
845 virtual void AppendText (const Led_tChar* text, size_t nTChars, const FontSpecification* fontSpec) override;
846#if qStroika_Frameworks_Led_SupportGDI
847 virtual void AppendEmbedding (SimpleEmbeddedObjectStyleMarker* embedding) override;
848#endif
849 virtual void AppendSoftLineBreak () override;
850 virtual void SetJustification (Justification justification) override;
851 virtual void SetStandardTabStopList (const StandardTabStopList& tabStops) override;
852 virtual void SetFirstIndent (TWIPS tx) override;
853 virtual void SetLeftMargin (TWIPS lhs) override;
854 virtual void SetRightMargin (TWIPS rhs) override;
855 virtual void SetSpaceBefore (TWIPS sb) override;
856 virtual void SetSpaceAfter (TWIPS sa) override;
857 virtual void SetLineSpacing (LineSpacing sl) override;
858 virtual void SetTextHidden (bool hidden) override;
859 virtual void StartTable () override;
860 virtual void EndTable () override;
861 virtual void StartTableRow () override;
862 virtual void EndTableRow () override;
863 virtual void StartTableCell (size_t colSpan) override;
864 virtual void EndTableCell () override;
865 virtual void SetListStyle (ListStyle listStyle) override;
866 virtual void SetListIndentLevel (unsigned char indentLevel) override;
867 virtual void SetTableBorderColor (Color c) override;
868 virtual void SetTableBorderWidth (TWIPS bWidth) override;
869 virtual void SetCellWidths (const vector<TWIPS>& cellWidths) override;
870 virtual void SetCellBackColor (const Color c) override;
871 virtual void SetDefaultCellMarginsForCurrentRow (TWIPS top, TWIPS left, TWIPS bottom, TWIPS right) override;
872 virtual void SetDefaultCellSpacingForCurrentRow (TWIPS top, TWIPS left, TWIPS bottom, TWIPS right) override;
873 virtual void EndOfBuffer () override;
874 virtual void Flush () override;
875
876 public:
877 nonvirtual void SetIgnoreLastParaAttributes (bool ignoreLastParaAttributes);
878
879 protected:
880 nonvirtual void PushContext (TextStore* ts, const shared_ptr<AbstractStyleDatabaseRep>& textStyleDatabase,
881 const shared_ptr<AbstractParagraphDatabaseRep>& paragraphDatabase,
882 const shared_ptr<HidableTextMarkerOwner>& hidableTextDatabase, size_t insertionStart);
883 nonvirtual void PopContext ();
884
885 private:
886 struct Context {
887 shared_ptr<AbstractParagraphDatabaseRep> fParagraphDatabase;
888 shared_ptr<HidableTextMarkerOwner> fHidableTextDatabase;
889 };
890 vector<Context> fSavedContexts;
891
892 private:
893 using ParaInfoNSize = pair<IncrementalParagraphInfo, size_t>;
894 shared_ptr<AbstractParagraphDatabaseRep> fParagraphDatabase;
895 shared_ptr<HidableTextMarkerOwner> fHidableTextDatabase;
896 vector<ParaInfoNSize> fSavedParaInfo;
897 IncrementalParagraphInfo fNewParagraphInfo;
898 bool fTextHidden;
899 DiscontiguousRun<bool> fHidableTextRuns;
900 bool fEndOfBuffer;
901 bool fIgnoreLastParaAttributes;
902 WordProcessorTable* fCurrentTable;
903 vector<TWIPS> fCurrentTableCellWidths;
904 Color fCurrentTableCellColor;
905 vector<size_t> fCurrentTableColSpanArray;
906 vector<WordProcessorTable*> fTableStack; // for nesting
907 size_t fNextTableRow;
908 size_t fNextTableCell;
909 size_t fCurrentTableCell;
910
911#if qStroika_Foundation_Debug_AssertionsChecked
912 private:
913 unsigned int fTableOpenLevel;
914 bool fTableRowOpen;
915 bool fTableCellOpen;
916#endif
917 };
918
919#if qStroika_Frameworks_Led_SupportGDI
920 DISABLE_COMPILER_MSC_WARNING_START (4250) // inherits via dominance warning
921 /*
922 @CLASS: StandardStyledWordWrappedTextInteractor
923 @BASES: @'InteractorInteractorMixinHelper<INTERACTOR1,INTERACTOR2>', (INTERACTOR1=@'StandardStyledTextInteractor',INTERACTOR2=@'WordWrappedTextInteractor')
924 @DESCRIPTION:
925 <p>A simple mixin of @'WordWrappedTextInteractor' and @'StandardStyledTextInteractor' using @'InteractorInteractorMixinHelper'.
926 Takes care of the nitty-gritty of combining their behaviors.</p>
927 */
928 class StandardStyledWordWrappedTextInteractor : public InteractorInteractorMixinHelper<StandardStyledTextInteractor, WordWrappedTextInteractor> {
929 private:
930 using inherited = InteractorInteractorMixinHelper<StandardStyledTextInteractor, WordWrappedTextInteractor>;
931
932 protected:
933 StandardStyledWordWrappedTextInteractor () = default;
934 };
935
936 /*
937 @CLASS: WordProcessor
938 @BASES: @'StandardStyledWordWrappedTextInteractor'
939 @DESCRIPTION: <p>A fancy word processor. Add high-end editing, more word-processor like features here.
940 For example, paragraph formating, justification, margins, remembered per-paragraph tabstops settings, etc.</p>
941 */
942 class WordProcessor : public StandardStyledWordWrappedTextInteractor {
943 private:
944 using inherited = StandardStyledWordWrappedTextInteractor;
945
946 protected:
947 WordProcessor ();
948
949 public:
950 ~WordProcessor ();
951
952 protected:
953 virtual void HookLosingTextStore () override;
954 nonvirtual void HookLosingTextStore_ ();
955 virtual void HookGainedNewTextStore () override;
956 nonvirtual void HookGainedNewTextStore_ ();
957
958 public:
959 nonvirtual bool GetSmartQuoteMode () const;
960 nonvirtual void SetSmartQuoteMode (bool smartQuoteMode);
961
962 private:
963 bool fSmartQuoteMode;
964
965 public:
966 class WordProcessorFlavorPackageInternalizer;
967 class WordProcessorFlavorPackageExternalizer;
968
969 public:
970 /*
971 @CLASS: WordProcessor::NoParagraphDatabaseAvailable
972 @BASES: @'TextImager::NotFullyInitialized'
973 @DESCRIPTION: <p>Thrown by @'WordProcessor::GetLayoutMargins' etc when no @':shared_ptr<AbstractParagraphDatabaseRep>' available.</p>
974 */
975 class NoParagraphDatabaseAvailable : public NotFullyInitialized {};
976
977 public:
978 class WPPartition;
979
980 virtual shared_ptr<Partition> MakeDefaultPartition () const override;
981
982 public:
983 nonvirtual shared_ptr<AbstractParagraphDatabaseRep> GetParagraphDatabase () const;
984 nonvirtual void SetParagraphDatabase (const shared_ptr<AbstractParagraphDatabaseRep>& paragraphDatabase);
985
986 private:
987 shared_ptr<AbstractParagraphDatabaseRep> fParagraphDatabase;
988 bool fICreatedParaDB;
989
990 protected:
991 virtual void HookParagraphDatabaseChanged ();
992 nonvirtual void HookParagraphDatabaseChanged_ ();
993
994 public:
995 nonvirtual shared_ptr<HidableTextMarkerOwner> GetHidableTextDatabase () const;
996 nonvirtual void SetHidableTextDatabase (const shared_ptr<HidableTextMarkerOwner>& hidableTextDatabase);
997
998 private:
999 shared_ptr<HidableTextMarkerOwner> fHidableTextDatabase;
1000 bool fICreatedHidableTextDB;
1001
1002 protected:
1003 virtual void HookHidableTextDatabaseChanged ();
1004 nonvirtual void HookHidableTextDatabaseChanged_ ();
1005
1006 protected:
1007 virtual shared_ptr<FlavorPackageInternalizer> MakeDefaultInternalizer () override;
1008 virtual shared_ptr<FlavorPackageExternalizer> MakeDefaultExternalizer () override;
1009
1010 protected:
1011 virtual void HookInternalizerChanged () override;
1012 virtual void HookExternalizerChanged () override;
1013
1014 public:
1015 virtual void InternalizeBestFlavor (ReaderFlavorPackage& flavorPackage, bool updateCursorPosition, bool autoScroll, UpdateMode updateMode) override;
1016 virtual void ExternalizeFlavors (WriterFlavorPackage& flavorPackage) override;
1017
1018 public:
1019 virtual void InterectiveSetRegionHidable (bool hidable);
1020
1021 public:
1022 nonvirtual Justification GetJustification (size_t characterPos) const;
1023 nonvirtual bool GetJustification (size_t from, size_t to, Justification* justification) const;
1024 nonvirtual void SetJustification (size_t from, size_t to, Justification justification);
1025
1026 public:
1027 static StandardTabStopList GetDefaultStandardTabStopList ();
1028 nonvirtual StandardTabStopList GetStandardTabStopList (size_t characterPos) const;
1029 nonvirtual bool GetStandardTabStopList (size_t from, size_t to, StandardTabStopList* tabStops) const;
1030 nonvirtual void SetStandardTabStopList (size_t from, size_t to, StandardTabStopList tabStops);
1031
1032 public:
1033 nonvirtual void GetMargins (size_t characterPos, TWIPS* leftMargin, TWIPS* rightMargin) const;
1034 nonvirtual bool GetMargins (size_t from, size_t to, TWIPS* leftMargin, TWIPS* rightMargin) const;
1035 nonvirtual void SetMargins (size_t from, size_t to, TWIPS leftMargin, TWIPS rightMargin);
1036
1037 public:
1038 nonvirtual TWIPS GetFirstIndent (size_t characterPos) const;
1039 nonvirtual bool GetFirstIndent (size_t from, size_t to, TWIPS* firstIndent) const;
1040 nonvirtual void SetFirstIndent (size_t from, size_t to, TWIPS firstIndent);
1041
1042 public:
1043 nonvirtual TWIPS GetSpaceBefore (size_t characterPos) const;
1044 nonvirtual bool GetSpaceBefore (size_t from, size_t to, TWIPS* sb) const;
1045 nonvirtual void SetSpaceBefore (size_t from, size_t to, TWIPS sb);
1046 nonvirtual TWIPS GetSpaceAfter (size_t characterPos) const;
1047 nonvirtual bool GetSpaceAfter (size_t from, size_t to, TWIPS* sa) const;
1048 nonvirtual void SetSpaceAfter (size_t from, size_t to, TWIPS sa);
1049 nonvirtual LineSpacing GetLineSpacing (size_t characterPos) const;
1050 nonvirtual bool GetLineSpacing (size_t from, size_t to, LineSpacing* sl) const;
1051 nonvirtual void SetLineSpacing (size_t from, size_t to, LineSpacing sl);
1052 nonvirtual ListStyle GetListStyle (size_t characterPos) const;
1053 nonvirtual bool GetListStyle (size_t from, size_t to, ListStyle* listStyle) const;
1054 nonvirtual void SetListStyle (size_t from, size_t to, ListStyle listStyle, bool autoFormat = false);
1055 nonvirtual unsigned char GetListIndentLevel (size_t characterPos) const;
1056 nonvirtual bool GetListIndentLevel (size_t from, size_t to, unsigned char* indentLevel) const;
1057 nonvirtual void SetListIndentLevel (size_t from, size_t to, unsigned char indentLevel, bool autoFormat = false);
1058
1059 protected:
1060 virtual Led_tString GetListLeader (size_t paragraphMarkerPos) const;
1061 virtual DistanceType GetListLeaderLength (size_t paragraphMarkerPos) const;
1062 virtual void AutoFormatIndentedText (size_t from, size_t to);
1063
1064 private:
1065 class WPIdler : public Idler {
1066 public:
1067 WPIdler ();
1068 virtual void SpendIdleTime () override;
1069 WordProcessor* fWP;
1070 };
1071 friend class WPIdler;
1072 WPIdler fWPIdler;
1073
1074 public:
1075 virtual void SetSelection (size_t start, size_t end) override;
1076 using TextInteractor::SetSelection;
1077
1078 public:
1079 virtual bool GetCaretShownSituation () const override;
1080 virtual Led_Rect CalculateCaretRect () const override;
1081
1082 public:
1083 virtual void OnTypedNormalCharacter (Led_tChar theChar, bool optionPressed, bool shiftPressed, bool commandPressed,
1084 bool controlPressed, bool altKeyPressed) override;
1085
1086 public:
1087 virtual bool ProcessSimpleClick (Led_Point clickedAt, unsigned clickCount, bool extendSelection, size_t* dragAnchor) override;
1088 virtual void WhileSimpleMouseTracking (Led_Point newMousePos, size_t dragAnchor) override;
1089
1090 // WordProcessorTable support
1091 public:
1092 virtual WordProcessorTable* InsertTable (size_t at);
1093
1094 nonvirtual vector<WordProcessorTable*> GetTablesInRange (size_t from, size_t to = static_cast<size_t> (-1)) const;
1095 nonvirtual WordProcessorTable* GetTableAt (size_t from) const;
1096
1097 public:
1098 nonvirtual WordProcessorTable* GetActiveTable () const;
1099
1100 public:
1101 struct CommandNames;
1102
1103 // This class builds commands with command names. The UI may wish to change these
1104 // names (eg. to customize for particular languages, etc)
1105 // Just patch these strings here, and commands will be created with these names.
1106 // (These names appear in text of undo menu item)
1107 public:
1108 static const CommandNames& GetCommandNames ();
1109 static void SetCommandNames (const CommandNames& cmdNames);
1110 static CommandNames MakeDefaultCommandNames ();
1111
1112 private:
1113 static CommandNames sCommandNames;
1114
1115 public:
1116 enum {
1117 kWordProcessorCommand_First = kTextInteractorCommand_Last + 1,
1118
1119 kSelectTableIntraCellAll_CmdID = kWordProcessorCommand_First,
1120 kSelectTableCell_CmdID,
1121 kSelectTableRow_CmdID,
1122 kSelectTableColumn_CmdID,
1123 kSelectTable_CmdID,
1124
1125 kBaseFontSize_CmdID = RoundUpToNearest_CMDNUMs_MACRO (kSelectTable_CmdID + 1, 0x100),
1126 kFontSize9_CmdID = kBaseFontSize_CmdID,
1127 kFontSize10_CmdID,
1128 kFontSize12_CmdID,
1129 kFontSize14_CmdID,
1130 kFontSize18_CmdID,
1131 kFontSize24_CmdID,
1132 kFontSize36_CmdID,
1133 kFontSize48_CmdID,
1134 kFontSize72_CmdID,
1135 kFontSizeOther_CmdID,
1136 kFontSizeSmaller_CmdID,
1137 kFontSizeLarger_CmdID,
1138 kLastFontSize_CmdID = kFontSizeLarger_CmdID,
1139
1140 kBaseFontColor_CmdID = RoundUpToNearest_CMDNUMs_MACRO (kLastFontSize_CmdID + 1, 0x100),
1141 kFontColorBlack_CmdID = kBaseFontColor_CmdID,
1142 kFontColorMaroon_CmdID,
1143 kFontColorGreen_CmdID,
1144 kFontColorOlive_CmdID,
1145 kFontColorNavy_CmdID,
1146 kFontColorPurple_CmdID,
1147 kFontColorTeal_CmdID,
1148 kFontColorGray_CmdID,
1149 kFontColorSilver_CmdID,
1150 kFontColorRed_CmdID,
1151 kFontColorLime_CmdID,
1152 kFontColorYellow_CmdID,
1153 kFontColorBlue_CmdID,
1154 kFontColorFuchsia_CmdID,
1155 kFontColorAqua_CmdID,
1156 kFontColorWhite_CmdID,
1157 kLastNamedFontColor_CmdID = kFontColorWhite_CmdID,
1158 kFontColorOther_CmdID,
1159 kLastFontColor_CmdID = kFontColorOther_CmdID,
1160
1161 kFirstJustification_CmdID = RoundUpToNearest_CMDNUMs_MACRO (kLastFontColor_CmdID + 1, 0x100),
1162 kJustifyLeft_CmdID = kFirstJustification_CmdID,
1163 kJustifyCenter_CmdID,
1164 kJustifyRight_CmdID,
1165 kJustifyFull_CmdID,
1166 kLastJustification_CmdID = kJustifyFull_CmdID,
1167
1168 kParagraphSpacingCommand_CmdID,
1169 kParagraphIndentsCommand_CmdID,
1170 kFirstListStyle_CmdID,
1171 kListStyle_None_CmdID = kFirstListStyle_CmdID,
1172 kListStyle_Bullet_CmdID,
1173 kLastListStyle_CmdID = kListStyle_Bullet_CmdID,
1174 kIncreaseIndent_CmdID,
1175 kDecreaseIndent_CmdID,
1176
1177 kFontMenuFirst_CmdID = RoundUpToNearest_CMDNUMs_MACRO (kDecreaseIndent_CmdID + 1, 0x100),
1178 kFontMenuLast_CmdID = kFontMenuFirst_CmdID + 0x400,
1179
1180 kFontStylePlain_CmdID,
1181 kFontStyleBold_CmdID,
1182 kFontStyleItalic_CmdID,
1183 kFontStyleUnderline_CmdID,
1184#if qStroika_Foundation_Common_Platform_Windows
1185 kFontStyleStrikeout_CmdID,
1186#endif
1187 kSubScriptCommand_CmdID,
1188 kSuperScriptCommand_CmdID,
1189 kFontStyleCommand_FirstCmdId = kFontStylePlain_CmdID,
1190 kFontStyleCommand_LastCmdId = kSuperScriptCommand_CmdID,
1191
1192 kChooseFontCommand_CmdID,
1193
1194 kInsertTable_CmdID = RoundUpToNearest_CMDNUMs_MACRO (kChooseFontCommand_CmdID + 1, 0x100),
1195 kInsertTableRowAbove_CmdID,
1196 kInsertTableRowBelow_CmdID,
1197 kInsertTableColBefore_CmdID,
1198 kInsertTableColAfter_CmdID,
1199 kInsertURL_CmdID,
1200 kInsertSymbol_CmdID,
1201
1202 kRemoveTableColumns_CmdID,
1203 kRemoveTableRows_CmdID,
1204
1205 kFirstSelectedEmbedding_CmdID = RoundUpToNearest_CMDNUMs_MACRO (kRemoveTableRows_CmdID + 1, 0x100),
1206 kSelectedEmbeddingProperties_CmdID = kFirstSelectedEmbedding_CmdID,
1207 kFirstPrivateEmbedding_CmdID,
1208 kLastPrivateEmbedding_CmdID = kFirstPrivateEmbedding_CmdID + 5,
1209 kLastSelectedEmbedding_CmdID = kLastPrivateEmbedding_CmdID,
1210
1211 kHideSelection_CmdID = RoundUpToNearest_CMDNUMs_MACRO (kLastSelectedEmbedding_CmdID + 1, 0x100),
1212 kUnHideSelection_CmdID,
1213
1214 kFirstShowHideGlyph_CmdID = RoundUpToNearest_CMDNUMs_MACRO (kUnHideSelection_CmdID + 1, 0x100),
1215 kShowHideParagraphGlyphs_CmdID = kFirstShowHideGlyph_CmdID,
1216 kShowHideTabGlyphs_CmdID,
1217 kShowHideSpaceGlyphs_CmdID,
1218 kLastShowHideGlyph_CmdID = kShowHideSpaceGlyphs_CmdID,
1219
1220 kWordProcessorCommand_Last = RoundUpToNearest_CMDNUMs_MACRO (kShowHideSpaceGlyphs_CmdID + 1, 0x100)
1221 };
1222
1223 public:
1224 class DialogSupport;
1225 static DialogSupport& GetDialogSupport ();
1226 static void SetDialogSupport (DialogSupport* ds);
1227
1228 private:
1229 static DialogSupport* sDialogSupport;
1230
1231 public:
1232 virtual DistanceType ComputeMaxHScrollPos () const override;
1233
1234 protected:
1235 nonvirtual TWIPS CalculateFarthestRightMarginInDocument () const;
1236 nonvirtual TWIPS GetFarthestRightMarginInDocument () const;
1237 nonvirtual TWIPS CalculateFarthestRightMarginInWindow () const;
1238 virtual TWIPS CalculateFarthestRightMargin () const;
1239
1240 protected:
1241 virtual void InvalidateAllCaches () override;
1242 virtual void TabletChangedMetrics () override;
1243
1244 public:
1245 virtual void DidUpdateText (const UpdateInfo& updateInfo) noexcept override;
1246
1247 public:
1248 nonvirtual IncrementalFontSpecification GetCurSelFontSpec () const;
1249
1250 private:
1251 mutable IncrementalFontSpecification fCachedCurSelFontSpec;
1252 mutable Justification fCachedCurSelJustification;
1253 mutable bool fCachedCurSelJustificationUnique;
1254 mutable bool fCachedCurSelFontSpecValid;
1255
1256 nonvirtual void AssureCurSelFontCacheValid () const;
1257
1258 protected:
1259 virtual void DoSingleCharCursorEdit (CursorMovementDirection direction, CursorMovementUnit movementUnit, CursorMovementAction action,
1260 UpdateMode updateMode = eDefaultUpdate, bool scrollToSelection = true) override;
1261
1262 public:
1263 virtual bool OnUpdateCommand (CommandUpdater* enabler) override;
1264 virtual bool OnPerformCommand (CommandNumber commandNumber) override;
1265
1266 protected:
1267 virtual bool PassAlongCommandToIntraCellModeTableCell (CommandNumber commandNumber);
1268 virtual bool PassAlongCommandToEachSelectedTableCell (CommandNumber commandNumber);
1269
1270 public:
1271 virtual void OnSelectAllCommand () override;
1272
1273 public:
1274 virtual void OnUpdateFontNameChangeCommand (CommandUpdater* enabler);
1275 virtual void OnFontNameChangeCommand (CommandNumber cmdNum);
1276 virtual void OnUpdateFontStylePlainCommand (CommandUpdater* enabler);
1277 virtual void OnFontStylePlainCommand ();
1278 virtual void OnUpdateFontStyleBoldCommand (CommandUpdater* enabler);
1279 virtual void OnFontStyleBoldCommand ();
1280 virtual void OnUpdateFontStyleItalicCommand (CommandUpdater* enabler);
1281 virtual void OnFontStyleItalicCommand ();
1282 virtual void OnUpdateFontStyleUnderlineCommand (CommandUpdater* enabler);
1283 virtual void OnFontStyleUnderlineCommand ();
1284#if qStroika_Foundation_Common_Platform_Windows
1285 virtual void OnUpdateFontStyleStrikeoutCommand (CommandUpdater* enabler);
1286 virtual void OnFontStyleStrikeoutCommand ();
1287#endif
1288 virtual void OnUpdateFontStyleSubscriptCommand (CommandUpdater* enabler);
1289 virtual void OnFontStyleSubscriptCommand ();
1290 virtual void OnUpdateFontStyleSuperscriptCommand (CommandUpdater* enabler);
1291 virtual void OnFontStyleSuperscriptCommand ();
1292 virtual void OnUpdateChooseFontCommand (CommandUpdater* enabler);
1293 virtual void OnChooseFontCommand ();
1294 virtual void OnUpdateFontSizeChangeCommand (CommandUpdater* enabler);
1295 virtual void OnFontSizeChangeCommand (CommandNumber cmdNum);
1296 virtual void OnUpdateFontColorChangeCommand (CommandUpdater* enabler);
1297 virtual void OnFontColorChangeCommand (CommandNumber cmdNum);
1298 virtual void OnUpdateInsertTableCommand (CommandUpdater* pCmdUI);
1299 virtual void OnInsertTableCommand ();
1300 virtual void OnUpdateInsertURLCommand (CommandUpdater* pCmdUI);
1301 virtual void OnInsertURLCommand ();
1302 virtual void OnUpdateInsertSymbolCommand (CommandUpdater* pCmdUI);
1303 virtual void OnInsertSymbolCommand ();
1304 virtual void OnUpdateSelectedEmbeddingExtendedCommand (CommandUpdater* pCmdUI);
1305 virtual bool OnSelectedEmbeddingExtendedCommand (CommandNumber cmdNum);
1306
1307 virtual void OnEditTablePropertiesDialog ();
1308
1309 virtual void OnUpdateHideSelectionCommands (CommandUpdater* enabler);
1310 virtual void OnHideSelection ();
1311 virtual void OnUnHideSelection ();
1312 virtual void OnUpdateParagraphJustificationCommand (CommandUpdater* enabler);
1313 virtual void OnParagraphJustificationCommand (CommandNumber cmdNum);
1314 virtual void OnUpdateParagraphSpacingChangeCommand (CommandUpdater* enabler);
1315 virtual void OnParagraphSpacingChangeCommand ();
1316 virtual void OnUpdateParagraphIndentsChangeCommand (CommandUpdater* enabler);
1317 virtual void OnParagraphIndentsChangeCommand ();
1318 virtual void OnUpdateListStyleChangeCommand (CommandUpdater* enabler);
1319 virtual void OnListStyleChangeCommand (CommandNumber cmdNum);
1320 virtual void OnUpdateIndentCommand (CommandUpdater* enabler);
1321 virtual void OnIndentCommand (CommandNumber cmdNum);
1322 virtual void OnUpdateShowHideGlyphCommand (CommandUpdater* enabler);
1323 virtual void OnShowHideGlyphCommand (CommandNumber cmdNum);
1324
1325 protected:
1326 virtual SDKString GetPrettyTypeName (SimpleEmbeddedObjectStyleMarker* m);
1327 nonvirtual SimpleEmbeddedObjectStyleMarker* GetSoleSelectedEmbedding () const;
1328
1329 public:
1330 class EmptySelectionParagraphSavedTextRep;
1331
1332 protected:
1333 virtual InteractiveReplaceCommand::SavedTextRep* InteractiveUndoHelperMakeTextRep (size_t regionStart, size_t regionEnd,
1334 size_t selStart, size_t selEnd) override;
1335
1336 public:
1337 virtual void InteractiveSetFont (const IncrementalFontSpecification& defaultFont) override;
1338
1339 public:
1340 nonvirtual void InteractiveSetJustification (Justification justification);
1341 nonvirtual void InteractiveSetStandardTabStopList (StandardTabStopList tabStops);
1342 nonvirtual void InteractiveSetMargins (TWIPS leftMargin, TWIPS rightMargin);
1343 nonvirtual void InteractiveSetFirstIndent (TWIPS firstIndent);
1344 nonvirtual void InteractiveSetMarginsAndFirstIndent (TWIPS leftMargin, TWIPS rightMargin, TWIPS firstIndent);
1345 nonvirtual void InteractiveSetParagraphSpacing (TWIPS spaceBefore, bool spaceBeforeValid, TWIPS spaceAfter, bool spaceAfterValid,
1346 LineSpacing lineSpacing, bool lineSpacingValid);
1347 nonvirtual void InteractiveSetListStyle (ListStyle listStyle);
1348 nonvirtual void InteractiveDoIndentChange (bool increase);
1349
1350 protected:
1351 virtual const TabStopList& GetTabStopList (size_t containingPos) const override;
1352
1353 protected:
1354 virtual void DrawBefore (const Led_Rect& subsetToDraw, bool printing) override;
1355
1356 protected:
1357 virtual void DrawRowSegments (Tablet* tablet, const Led_Rect& currentRowRect, const Led_Rect& invalidRowRect,
1358 const TextLayoutBlock& text, size_t rowStart, size_t rowEnd) override;
1359
1360 protected:
1361 virtual vector<Led_Rect> GetRowHilightRects (const TextLayoutBlock& text, size_t rowStart, size_t rowEnd, size_t hilightStart,
1362 size_t hilightEnd) const override;
1363
1364 public:
1365 virtual void DrawSegment (Tablet* tablet, size_t from, size_t to, const TextLayoutBlock& text, const Led_Rect& drawInto,
1366 const Led_Rect& invalidRect, CoordinateType useBaseLine, DistanceType* pixelsDrawn) override;
1367
1368 protected:
1369 virtual DistanceType MeasureSegmentHeight (size_t from, size_t to) const override;
1370 virtual DistanceType MeasureSegmentBaseLine (size_t from, size_t to) const override;
1371
1372 private:
1373 nonvirtual DistanceType MeasureMinSegDescent (size_t from, size_t to) const;
1374
1375 protected:
1376 virtual void AdjustBestRowLength (size_t textStart, const Led_tChar* text, const Led_tChar* end, size_t* rowLength) override;
1377
1378 public:
1379 nonvirtual bool GetShowParagraphGlyphs () const;
1380 nonvirtual void SetShowParagraphGlyphs (bool showParagraphGlyphs);
1381
1382 private:
1383 bool fShowParagraphGlyphs;
1384
1385 public:
1386 nonvirtual bool GetShowTabGlyphs () const;
1387 nonvirtual void SetShowTabGlyphs (bool showTabGlyphs);
1388
1389 private:
1390 bool fShowTabGlyphs;
1391
1392 public:
1393 nonvirtual bool GetShowSpaceGlyphs () const;
1394 nonvirtual void SetShowSpaceGlyphs (bool showSpaceGlyphs);
1395
1396 private:
1397 bool fShowSpaceGlyphs;
1398
1399 public:
1400 virtual size_t ComputeRelativePosition (size_t fromPos, CursorMovementDirection direction, CursorMovementUnit movementUnit) override;
1401
1402 protected:
1403 virtual bool ContainsMappedDisplayCharacters (const Led_tChar* text, size_t nTChars) const override;
1404 virtual void ReplaceMappedDisplayCharacters (const Led_tChar* srcText, Led_tChar* copyText, size_t nTChars) const override;
1405
1406 public:
1407 virtual Led_Rect GetCharLocationRowRelative (size_t afterPosition, RowReference topRow, size_t maxRowsToCheck) const override;
1408 virtual size_t GetCharAtLocationRowRelative (const Led_Point& where, RowReference topRow, size_t maxRowsToCheck) const override;
1409
1410 protected:
1411 virtual size_t ResetTabStops (size_t from, const Led_tChar* text, size_t nTChars, DistanceType* charLocations, size_t startSoFar) const override;
1412
1413 private:
1414 nonvirtual size_t ResetTabStopsWithMargin (DistanceType lhsMargin, size_t from, const Led_tChar* text, size_t nTChars,
1415 DistanceType* charLocations, size_t startSoFar) const;
1416
1417 public:
1418 virtual void GetLayoutMargins (RowReference row, CoordinateType* lhs, CoordinateType* rhs) const override;
1419
1420 protected:
1421 virtual void ExpandedFromAndToInPostReplace (size_t from, size_t newTo, size_t stableTypingRegionStart, size_t stableTypingRegionEnd,
1422 size_t startPositionOfRowWhereReplaceBegins, size_t startPositionOfRowAfterReplaceEnds,
1423 size_t* expandedFrom, size_t* expandedTo) override;
1424 virtual void PostReplace (PreReplaceInfo& preReplaceInfo) override;
1425
1426 private:
1427 nonvirtual DistanceType CalcSpaceToEat (size_t rowContainingCharPos) const;
1428
1429 private:
1430 friend class AbstractParagraphDatabaseRep;
1431 friend class ParagraphDatabaseRep;
1432 friend class WordProcessorTable;
1433 };
1434
1435 /*
1436 @CLASS: WordProcessor::WordProcessorFlavorPackageInternalizer
1437 @BASES: virtual @'StandardStyledTextInteractor::StyledTextFlavorPackageInternalizer'
1438 @DESCRIPTION: <p>Add paragraph etc support support by creating a @'WordProcessor::WordProcessorTextIOSinkStream'.</p>
1439 */
1440 class WordProcessor::WordProcessorFlavorPackageInternalizer : public StandardStyledTextInteractor::StyledTextFlavorPackageInternalizer {
1441 private:
1442 using inherited = StandardStyledTextInteractor::StyledTextFlavorPackageInternalizer;
1443
1444 public:
1445 WordProcessorFlavorPackageInternalizer (TextStore& ts, const shared_ptr<AbstractStyleDatabaseRep>& styleDatabase,
1446 const shared_ptr<AbstractParagraphDatabaseRep>& paragraphDatabase,
1447 const shared_ptr<HidableTextMarkerOwner>& hidableTextDatabase);
1448
1449 public:
1450 nonvirtual bool GetOverwriteTableMode () const;
1451 nonvirtual void SetOverwriteTableMode (bool overwriteTableMode);
1452
1453 private:
1454 bool fOverwriteTableMode;
1455
1456#if !qStroika_Frameworks_Led_NestedTablesSupported
1457 public:
1458 nonvirtual bool GetNoTablesAllowed () const;
1459 nonvirtual void SetNoTablesAllowed (bool noTablesAllowed);
1460
1461 private:
1462 bool fNoTablesAllowed;
1463#endif
1464
1465 public:
1466 virtual StandardStyledTextIOSinkStream* mkStandardStyledTextIOSinkStream (size_t insertionStart) override;
1467
1468 protected:
1469 shared_ptr<AbstractParagraphDatabaseRep> fParagraphDatabase;
1470 shared_ptr<HidableTextMarkerOwner> fHidableTextDatabase;
1471 };
1472
1473 /*
1474 @CLASS: WordProcessor::WPPartition
1475 @BASES: @'LineBasedPartition'
1476 @DESCRIPTION: <p>A partition object which respects the funny rules for tables - and makes sure tables appear within their
1477 own partition element.</p>
1478 */
1479 class WordProcessor::WPPartition : public LineBasedPartition {
1480 public:
1481 using PartitionMarker = PartitioningTextImager::PartitionMarker;
1482 using UpdateInfo = MarkerOwner::UpdateInfo;
1483
1484 private:
1485 using inherited = LineBasedPartition;
1486
1487 public:
1488 WPPartition (TextStore& textStore, MarkerOwner& tableMarkerOwner);
1489
1490 protected:
1491 virtual vector<WordProcessorTable*> GetTablesInRange (size_t from, size_t to = static_cast<size_t> (-1)) const;
1492
1493 protected:
1494 virtual void FinalConstruct () override;
1495
1496 public:
1497 virtual void DidUpdateText (const UpdateInfo& updateInfo) noexcept override;
1498
1499 protected:
1500 nonvirtual void DoHandleUpdateForTableRangeCheck (size_t from, size_t to) noexcept;
1501
1502 protected:
1503 virtual bool NeedToCoalesce (PartitionMarker* pm) noexcept override;
1504
1505#if qStroika_Foundation_Debug_AssertionsChecked
1506 protected:
1507 virtual void Invariant_ () const override;
1508#endif
1509
1510 private:
1511 MarkerOwner& fTableMarkerOwner;
1512
1513 private:
1514 friend class WordProcessorTable;
1515 };
1516
1517 /*
1518 @CLASS: WordProcessor::WordProcessorFlavorPackageExternalizer
1519 @BASES: virtual @'StandardStyledTextInteractor::StyledTextFlavorPackageExternalizer'
1520 @DESCRIPTION: <p>Add paragraph etc support support by creating a @'WordProcessor::WordProcessorTextIOSrcStream'.</p>
1521 */
1522 class WordProcessor::WordProcessorFlavorPackageExternalizer : public StandardStyledTextInteractor::StyledTextFlavorPackageExternalizer {
1523 private:
1524 using inherited = StandardStyledTextInteractor::StyledTextFlavorPackageExternalizer;
1525
1526 public:
1527 WordProcessorFlavorPackageExternalizer (TextStore& ts, const shared_ptr<AbstractStyleDatabaseRep>& styleDatabase,
1528 const shared_ptr<AbstractParagraphDatabaseRep>& paragraphDatabase,
1529 const shared_ptr<HidableTextMarkerOwner>& hidableTextDatabase);
1530
1531 public:
1532 nonvirtual bool GetUseTableSelection () const;
1533 nonvirtual void SetUseTableSelection (bool useTableSelection);
1534
1535 private:
1536 bool fUseTableSelection{false};
1537
1538 protected:
1539 virtual StandardStyledTextIOSrcStream* mkStandardStyledTextIOSrcStream (size_t selectionStart, size_t selectionEnd) override;
1540
1541 protected:
1542 shared_ptr<AbstractParagraphDatabaseRep> fParagraphDatabase;
1543 shared_ptr<HidableTextMarkerOwner> fHidableTextDatabase;
1544 };
1545
1546 /*
1547 @CLASS: WordProcessorTable::SuppressCellUpdatePropagationContext
1548 @ACCESS: private
1549 @DESCRIPTION: <p>.</p>
1550 */
1551 class WordProcessorTable::SuppressCellUpdatePropagationContext {
1552 public:
1553 SuppressCellUpdatePropagationContext (WordProcessorTable& t);
1554 ~SuppressCellUpdatePropagationContext ();
1555
1556 private:
1557 WordProcessorTable& fTable;
1558 bool fOldVal;
1559 };
1560
1561 /*
1562 @CLASS: WordProcessorTable::AllowUpdateInfoPropagationContext
1563 @ACCESS: protected
1564 @DESCRIPTION: <p>.</p>
1565 */
1566 class WordProcessorTable::AllowUpdateInfoPropagationContext {
1567 public:
1568 AllowUpdateInfoPropagationContext (WordProcessorTable& t);
1569 ~AllowUpdateInfoPropagationContext ();
1570
1571 private:
1572 WordProcessorTable& fTable;
1573 bool fOldVal;
1574 };
1575
1576 /*
1577 @CLASS: WordProcessorTable::EmbeddedTableWordProcessor
1578 @BASES: @'WordProcessor'
1579 @DESCRIPTION: <p>Used internally by the @'WordProcessorTable' code for mini embedded word processor objects
1580 in each cell. A subclass of these are constructed by @'WordProcessor::ConstructEmbeddedTableWordProcessor'</p>
1581 <p>Note that we choose to instantiate this WP object with a WindowRect in the same coordinates as
1582 the the owning tables WindowRect: not relative to that table.
1583 </p>
1584 */
1585 class WordProcessorTable::EmbeddedTableWordProcessor : public WordProcessor {
1586 private:
1587 using inherited = WordProcessor;
1588
1589 public:
1590 EmbeddedTableWordProcessor (WordProcessor& owningWordProcessor, WordProcessorTable& owningTable, size_t tRow, size_t tCol, bool activeEditCell);
1591
1592 public:
1593 nonvirtual WordProcessor& GetOwningWordProcessor () const;
1594 nonvirtual WordProcessorTable& GetOwningTable () const;
1595
1596 private:
1597 WordProcessor& fOwningWordProcessor;
1598 WordProcessorTable& fOwningTable;
1599 size_t fTableRow;
1600 size_t fTableColumn;
1601
1602 public:
1603 nonvirtual void SaveMiscActiveFocusInfo ();
1604 nonvirtual void RestoreMiscActiveFocusInfo ();
1605
1606#if !qStroika_Frameworks_Led_NestedTablesSupported
1607 protected:
1608 virtual void HookInternalizerChanged () override;
1609#endif
1610
1611 protected:
1612 virtual bool OnCopyCommand_Before () override;
1613 virtual void OnCopyCommand_After () override;
1614 virtual bool OnPasteCommand_Before () override;
1615 virtual void OnPasteCommand_After () override;
1616
1617 protected:
1618 virtual void DrawRowHilight (Tablet* tablet, const Led_Rect& currentRowRect, const Led_Rect& invalidRowRect,
1619 const TextLayoutBlock& text, size_t rowStart, size_t rowEnd) override;
1620
1621 //pure virtual overrides to make this class compile..
1622 public:
1623 virtual Tablet* AcquireTablet () const override;
1624 virtual void ReleaseTablet (Tablet* tablet) const override;
1625
1626 protected:
1627 virtual void RefreshWindowRect_ (const Led_Rect& windowRectArea, UpdateMode updateMode) const override;
1628 virtual void UpdateWindowRect_ (const Led_Rect& windowRectArea) const override;
1629 virtual bool QueryInputKeyStrokesPending () const override;
1630
1631 protected:
1632 virtual void SetDefaultUpdateMode (UpdateMode defaultUpdateMode) override;
1633
1634 public:
1635 virtual void GetLayoutMargins (RowReference row, CoordinateType* lhs, CoordinateType* rhs) const override;
1636
1637 public:
1638 nonvirtual DistanceType GetDesiredHeight () const;
1639
1640 private:
1641 mutable DistanceType fDesiredHeight;
1642 mutable bool fDesiredHeightValid;
1643 bool fActiveEditCell;
1644
1645 public:
1646 virtual void PostInteractiveUndoPostHelper (InteractiveReplaceCommand::SavedTextRep** beforeRep,
1647 InteractiveReplaceCommand::SavedTextRep** afterRep, size_t startOfInsert,
1648 const SDKString& cmdName) override;
1649
1650 protected:
1651 virtual InteractiveReplaceCommand::SavedTextRep* InteractiveUndoHelperMakeTextRep (size_t regionStart, size_t regionEnd,
1652 size_t selStart, size_t selEnd) override;
1653
1654 private:
1655 class DisableRefreshContext;
1656
1657 private:
1658 bool fSuppressRefreshCalls;
1659
1660 private:
1661 class TemporarilyUseTablet;
1662
1663 private:
1664 Tablet* fUpdateTablet; // assigned in stack-based fasion during update/draw calls.
1665 private:
1666 friend class WordProcessorTable;
1667 friend class WordProcessorTable::EmbeddedTableWordProcessor::TemporarilyUseTablet;
1668 friend class WordProcessorTable::EmbeddedTableWordProcessor::DisableRefreshContext;
1669 friend class WordProcessorTable::TemporarilyAllocateCellWithTablet;
1670 };
1671
1672 /**
1673 */
1674 class WordProcessorTable::SavedTextRepWSel : public InteractiveReplaceCommand::SavedTextRep,
1675 public Foundation::Memory::UseBlockAllocationIfAppropriate<SavedTextRepWSel> {
1676 private:
1677 using inherited = InteractiveReplaceCommand::SavedTextRep;
1678
1679 public:
1680 enum WPRelativeFlag {
1681 eWPDirect,
1682 eWPAbove
1683 };
1684
1685 public:
1686 SavedTextRepWSel (SavedTextRep* delegateTo, WordProcessorTable& table, WPRelativeFlag wPRelativeFlag);
1687
1688 public:
1689 virtual size_t GetLength () const override;
1690 virtual void InsertSelf (TextInteractor* interactor, size_t at, size_t nBytesToOverwrite) override;
1691 virtual void ApplySelection (TextInteractor* imager) override;
1692
1693 private:
1694 WPRelativeFlag fWPRelativeFlag;
1695 unique_ptr<SavedTextRep> fRealRep;
1696 size_t fRowSelStart{0};
1697 size_t fRowSelEnd{0};
1698 size_t fColSelStart{0};
1699 size_t fColSelEnd{0};
1700 bool fIntraCellMode{false};
1701 size_t fIntraCellSelStart{0};
1702 size_t fIntraCellSelEnd{0};
1703 };
1704 DISABLE_COMPILER_MSC_WARNING_END (4250) // inherits via dominance warning
1705
1706 /*
1707 @CLASS: WordProcessorTable::EmbeddedTableWordProcessor::TemporarilyUseTablet
1708 @DESCRIPTION: <p>Utility class to use (with caution), to temporarily force a given tablet to be
1709 used for a given @'WordProcessorTable::EmbeddedTableWordProcessor'. NB: This causes
1710 the @'TextImager::TabletChangedMetrics' method by default
1711 (unless called with special arg).</p>
1712 */
1713 class WordProcessorTable::EmbeddedTableWordProcessor::TemporarilyUseTablet {
1714 public:
1715 using EmbeddedTableWordProcessor = WordProcessorTable::EmbeddedTableWordProcessor;
1716
1717 public:
1718 enum DoTextMetricsChangedCall {
1719 eDoTextMetricsChangedCall,
1720 eDontDoTextMetricsChangedCall
1721 };
1722 TemporarilyUseTablet (EmbeddedTableWordProcessor& editor, Tablet* t, DoTextMetricsChangedCall tmChanged = eDoTextMetricsChangedCall);
1723 ~TemporarilyUseTablet ();
1724
1725 private:
1726 EmbeddedTableWordProcessor& fEditor;
1727 Tablet* fOldTablet;
1728 DoTextMetricsChangedCall fDoTextMetricsChangedCall;
1729 };
1730
1731 /*
1732 @CLASS: WordProcessorTable::EmbeddedTableWordProcessor::DisableRefreshContext
1733 @ACCESS: private
1734 @DESCRIPTION: <p>Utility class to use (with caution), to temporarily force a given tablet to be
1735 used for a given @'WordProcessorTable::EmbeddedTableWordProcessor'. NB: This causes
1736 the @'TextImager::TabletChangedMetrics' method by default
1737 (unless called with special arg).</p>
1738 */
1739 class WordProcessorTable::EmbeddedTableWordProcessor::DisableRefreshContext {
1740 public:
1741 DisableRefreshContext (EmbeddedTableWordProcessor& wp);
1742 ~DisableRefreshContext ();
1743
1744 private:
1745 EmbeddedTableWordProcessor& fWP;
1746 bool fOldVal;
1747 };
1748
1749 /*
1750 @CLASS: WordProcessorTable::TemporarilySetOwningWP
1751 @DESCRIPTION: <p>Since a table is assocated with a paragraph database, and can be viewed and edited
1752 simultaneously be multiple views (WordProcessors) - we cannot make long-term assumptions
1753 about association of a table with an owning WordProcessor object. Instead - during UI operations
1754 like typing and so on - we temporarily associate an owning WP with the given table using
1755 this class.</p>
1756 */
1757 class WordProcessorTable::TemporarilySetOwningWP {
1758 public:
1759 TemporarilySetOwningWP (const WordProcessorTable& forTable, WordProcessor& forWordProcessor);
1760 ~TemporarilySetOwningWP ();
1761
1762 private:
1763 WordProcessorTable& fOwningTable;
1764 WordProcessor* fSavedTableOwningWP; // in case references are nested, though I'm not sure this can happen
1765 };
1766
1767 /**
1768 */
1769 class WordProcessorTable::TemporarilyAllocateCellWP {
1770 public:
1771 using EmbeddedTableWordProcessor = WordProcessorTable::EmbeddedTableWordProcessor;
1772
1773 public:
1774 TemporarilyAllocateCellWP (WordProcessorTable& forTable, WordProcessor& forWordProcessor, size_t forRow, size_t forColumn,
1775 const Led_Rect& cellWindowRect, bool captureChangesForUndo = true);
1776 ~TemporarilyAllocateCellWP ();
1777
1778 nonvirtual operator EmbeddedTableWordProcessor* ();
1779 nonvirtual EmbeddedTableWordProcessor& operator& ();
1780 nonvirtual EmbeddedTableWordProcessor* operator->();
1781
1782 private:
1783 WordProcessorTable& fOwningTable;
1784 EmbeddedTableWordProcessor* fCellEditor;
1785 };
1786
1787 /**
1788 */
1789 class WordProcessorTable::TemporarilyAllocateCellWithTablet {
1790 public:
1791 using Tablet_Acquirer = TextInteractor::Tablet_Acquirer; // needed for GCC 2.96 - seems like the requirement maybe a compiler bug... LGP 2003-04-18
1792
1793 public:
1794 TemporarilyAllocateCellWithTablet (WordProcessorTable& forTable, size_t row, size_t column, bool captureChangesForUndo = true);
1795
1796 public:
1797 using TemporarilyUseTablet = EmbeddedTableWordProcessor::TemporarilyUseTablet;
1798
1799 public:
1800 nonvirtual operator EmbeddedTableWordProcessor* ();
1801 nonvirtual EmbeddedTableWordProcessor& operator& ();
1802 nonvirtual EmbeddedTableWordProcessor* operator->();
1803
1804 private:
1805 TemporarilyAllocateCellWP fWP;
1806 Tablet_Acquirer fTablet;
1807 TemporarilyUseTablet fTmpUseTablet;
1808 };
1809
1810 /*
1811 @CLASS: WordProcessor::CommandNames
1812 @DESCRIPTION: <p>Command names for each of the user-visible commands produced by the @'WordProcessor' module.
1813 This name is used used in the constructed Undo command name, as
1814 in, "Undo Justification". You can replace this name with whatever you like.
1815 You change this value with @'WordProcessor::SetCommandNames'.</p>
1816 <p> The point of this is to allow for different UI-language localizations,
1817 without having to change Led itself. Note also that these strings aren't always exactly
1818 a command-name. Sometimes they are just other strings to be localized.</p>
1819 <p>See also @'WordProcessor::GetCommandNames'.</p>
1820 */
1821 struct WordProcessor::CommandNames {
1822 SDKString fJustificationCommandName;
1823 SDKString fStandardTabStopListCommandName;
1824 SDKString fMarginsCommandName;
1825 SDKString fFirstIndentCommandName;
1826 SDKString fMarginsAndFirstIndentCommandName;
1827 SDKString fParagraphSpacingCommandName;
1828 SDKString fHideCommandName;
1829 SDKString fUnHideCommandName;
1830 SDKString fSetListStyleCommandName;
1831 SDKString fIndentLevelChangeCommandName;
1832 SDKString fInsertTableCommandName;
1833 SDKString fInsertTableRowAboveCommandName;
1834 SDKString fInsertTableRowBelowCommandName;
1835 SDKString fInsertTableColBeforeCommandName;
1836 SDKString fInsertTableColAfterCommandName;
1837 SDKString fInsertURLCommandName;
1838 SDKString fRemoveTableRowsCommandName;
1839 SDKString fRemoveTableColumnsCommandName;
1840 SDKString fEmbeddingTypeName_ImageDIB;
1841 SDKString fEmbeddingTypeName_URL;
1842 SDKString fEmbeddingTypeName_ImageMacPict;
1843 SDKString fEmbeddingTypeName_Table;
1844 SDKString fEmbeddingTypeName_Unknown;
1845 SDKString fFontSizeChange_Other_NoArg;
1846 SDKString fFontSizeChange_Other_OneArg;
1847 SDKString fTablePropertiesCommandName;
1848 SDKString fGenericEmbeddingPropertiesCommandName;
1849 SDKString fChangeTablePropertiesCommandName;
1850 };
1851
1852 /*
1853 @CLASS: WordProcessor::DialogSupport
1854 @DESCRIPTION: <p></p>
1855 */
1856 class WordProcessor::DialogSupport {
1857 public:
1858 using CommandNumber = TextInteractor::CommandNumber;
1859 using FontNameSpecifier = FontSpecification::FontNameSpecifier;
1860
1861 public:
1862 virtual FontNameSpecifier CmdNumToFontName (CommandNumber cmdNum);
1863 virtual bool IsPredefinedFontSize (DistanceType fontSize); // return true iff the arg fontSize is one of the predefined ones from the menu
1864 virtual DistanceType FontCmdToSize (CommandNumber commandNum);
1865 virtual DistanceType PickOtherFontHeight (DistanceType origHeight); // display UI (dialog box) and query user for new height)
1866 virtual bool PickNewParagraphLineSpacing (TWIPS* spaceBefore, bool* spaceBeforeValid, TWIPS* spaceAfter, bool* spaceAfterValid,
1867 LineSpacing* lineSpacing, bool* lineSpacingValid);
1868 virtual bool PickNewParagraphMarginsAndFirstIndent (TWIPS* leftMargin, bool* leftMarginValid, TWIPS* rightMargin,
1869 bool* rightMarginValid, TWIPS* firstIndent, bool* firstIndentValid);
1870 virtual Color FontCmdToColor (CommandNumber cmd);
1871 virtual CommandNumber FontColorToCmd (Color color);
1872 virtual bool PickOtherFontColor (Color* color);
1873 virtual bool ChooseFont (IncrementalFontSpecification* font); // display UI (e.g. CFontDialog) to pick a new font/color
1874 virtual void ShowSimpleEmbeddingInfoDialog (const SDKString& embeddingTypeName);
1875 virtual bool ShowURLEmbeddingInfoDialog (const SDKString& embeddingTypeName, SDKString* urlTitle, SDKString* urlValue);
1876 virtual bool ShowAddURLEmbeddingInfoDialog (SDKString* urlTitle, SDKString* urlValue);
1877 virtual bool AddNewTableDialog (size_t* nRows, size_t* nCols);
1878 struct TableSelectionPropertiesInfo;
1879 virtual bool EditTablePropertiesDialog (TableSelectionPropertiesInfo* tableProperties);
1880
1881#if qStroika_Foundation_Common_Platform_Windows
1882 private:
1883 static UINT_PTR CALLBACK ColorPickerINITPROC (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
1884#endif
1885 };
1886
1887 /*
1888 @CLASS: WordProcessor::DialogSupport::TableSelectionPropertiesInfo
1889 @DESCRIPTION: <p></p>
1890 */
1891 struct WordProcessor::DialogSupport::TableSelectionPropertiesInfo {
1892 TableSelectionPropertiesInfo ();
1893
1894 TWIPS fTableBorderWidth;
1895 Color fTableBorderColor;
1896
1897 TWIPS_Rect fDefaultCellMargins;
1898 TWIPS fCellSpacing;
1899
1900 bool fCellWidth_Common;
1901 TWIPS fCellWidth;
1902
1903 bool fCellBackgroundColor_Common;
1904 Color fCellBackgroundColor;
1905 };
1906
1907 /**
1908 */
1909 class WordProcessor::EmptySelectionParagraphSavedTextRep : public StandardStyledTextInteractor::EmptySelStyleTextRep {
1910 private:
1911 using inherited = StandardStyledTextInteractor::EmptySelStyleTextRep;
1912
1913 public:
1914 EmptySelectionParagraphSavedTextRep (WordProcessor* interactor, size_t selStart, size_t selEnd, size_t at);
1915
1916 public:
1917 virtual void InsertSelf (TextInteractor* interactor, size_t at, size_t nBytesToOverwrite) override;
1918
1919 private:
1920 ParagraphInfo fSavedStyleInfo;
1921 };
1922#endif
1923
1924}
1925
1926/*
1927 ********************************************************************************
1928 ***************************** Implementation Details ***************************
1929 ********************************************************************************
1930 */
1931#include "WordProcessor.inl"
1932
1933#endif /*_Stroika_Frameworks_Led_WordProcessor_h_*/
basic_string< SDKChar > SDKString
Definition SDKString.h:38