5#include "Stroika/Foundation/StroikaPreComp.h"
7DISABLE_COMPILER_MSC_WARNING_START (5054)
9DISABLE_COMPILER_MSC_WARNING_END (5054)
14#include "Stroika/Frameworks/Led/StdDialogs.h"
17#include "LedLineItApplication.h"
18#include "LedLineItDocument.h"
19#include "LedLineItMainFrame.h"
23#include "LedLineItView.h"
26using namespace Stroika::Frameworks::Led;
30class My_CMDNUM_MAPPING :
public MFC_CommandNumberMapping {
34 AddAssociation (ID_EDIT_UNDO, LedLineItView::kUndo_CmdID);
35 AddAssociation (ID_EDIT_REDO, LedLineItView::kRedo_CmdID);
36 AddAssociation (ID_EDIT_SELECT_ALL, LedLineItView::kSelectAll_CmdID);
37 AddAssociation (ID_EDIT_CUT, LedLineItView::kCut_CmdID);
38 AddAssociation (ID_EDIT_COPY, LedLineItView::kCopy_CmdID);
39 AddAssociation (ID_EDIT_PASTE, LedLineItView::kPaste_CmdID);
40 AddAssociation (ID_EDIT_CLEAR, LedLineItView::kClear_CmdID);
41 AddAssociation (kFindCmd, LedLineItView::kFind_CmdID);
42 AddAssociation (kFindAgainCmd, LedLineItView::kFindAgain_CmdID);
43 AddAssociation (kEnterFindStringCmd, LedLineItView::kEnterFindString_CmdID);
44 AddAssociation (kReplaceCmd, LedLineItView::kReplace_CmdID);
45 AddAssociation (kReplaceAgainCmd, LedLineItView::kReplaceAgain_CmdID);
46#if qIncludeBasicSpellcheckEngine
47 AddAssociation (kSpellCheckCmd, LedLineItView::kSpellCheck_CmdID);
51My_CMDNUM_MAPPING sMy_CMDNUM_MAPPING;
53struct LedLineIt_DialogSupport : TextInteractor::DialogSupport {
55 LedLineIt_DialogSupport ()
57 TextInteractor::SetDialogSupport (
this);
59 ~LedLineIt_DialogSupport ()
61 TextInteractor::SetDialogSupport (NULL);
65 virtual void DisplayFindDialog (Led_tString* findText,
const vector<Led_tString>& recentFindSuggestions,
bool* wrapSearch,
66 bool* wholeWordSearch,
bool* caseSensative,
bool* pressedOK)
override
68 Led_StdDialogHelper_FindDialog findDialog{::AfxGetResourceHandle (), ::GetActiveWindow ()};
70 findDialog.fFindText = *findText;
71 findDialog.fRecentFindTextStrings = recentFindSuggestions;
72 findDialog.fWrapSearch = *wrapSearch;
73 findDialog.fWholeWordSearch = *wholeWordSearch;
74 findDialog.fCaseSensativeSearch = *caseSensative;
76 findDialog.DoModal ();
78 *findText = findDialog.fFindText;
79 *wrapSearch = findDialog.fWrapSearch;
80 *wholeWordSearch = findDialog.fWholeWordSearch;
81 *caseSensative = findDialog.fCaseSensativeSearch;
82 *pressedOK = findDialog.fPressedOK;
85#if qSupportStdReplaceDlg
87 virtual ReplaceButtonPressed DisplayReplaceDialog (Led_tString* findText,
const vector<Led_tString>& recentFindSuggestions,
88 Led_tString* replaceText,
bool* wrapSearch,
bool* wholeWordSearch,
bool* caseSensative)
override
90 Led_StdDialogHelper_ReplaceDialog replaceDialog{::AfxGetResourceHandle (), ::GetActiveWindow ()};
92 replaceDialog.fFindText = *findText;
93 replaceDialog.fRecentFindTextStrings = recentFindSuggestions;
94 replaceDialog.fReplaceText = *replaceText;
95 replaceDialog.fWrapSearch = *wrapSearch;
96 replaceDialog.fWholeWordSearch = *wholeWordSearch;
97 replaceDialog.fCaseSensativeSearch = *caseSensative;
99 replaceDialog.DoModal ();
101 *findText = replaceDialog.fFindText;
102 *replaceText = replaceDialog.fReplaceText;
103 *wrapSearch = replaceDialog.fWrapSearch;
104 *wholeWordSearch = replaceDialog.fWholeWordSearch;
105 *caseSensative = replaceDialog.fCaseSensativeSearch;
107 switch (replaceDialog.fPressed) {
108 case Led_StdDialogHelper_ReplaceDialog::eCancel:
109 return eReplaceButton_Cancel;
110 case Led_StdDialogHelper_ReplaceDialog::eFind:
111 return eReplaceButton_Find;
112 case Led_StdDialogHelper_ReplaceDialog::eReplace:
113 return eReplaceButton_Replace;
114 case Led_StdDialogHelper_ReplaceDialog::eReplaceAll:
115 return eReplaceButton_ReplaceAll;
116 case Led_StdDialogHelper_ReplaceDialog::eReplaceAllInSelection:
117 return eReplaceButton_ReplaceAllInSelection;
120 return eReplaceButton_Cancel;
123#if qSupportStdSpellCheckDlg
125 virtual void DisplaySpellCheckDialog (SpellCheckDialogCallback& callback)
override
127 Led_StdDialogHelper_SpellCheckDialog::CallbackDelegator<SpellCheckDialogCallback> delegator (callback);
128#if qStroika_Foundation_Common_Platform_MacOS
129 Led_StdDialogHelper_SpellCheckDialog spellCheckDialog (delegator);
130#elif qStroika_Foundation_Common_Platform_Windows
131 Led_StdDialogHelper_SpellCheckDialog spellCheckDialog (delegator, ::AfxGetResourceHandle (), ::GetActiveWindow ());
132#elif qStroika_FeatureSupported_XWindows
133 Led_StdDialogHelper_SpellCheckDialog spellCheckDialog (delegator, GTK_WINDOW (LedItApplication::Get ().GetAppWindow ()));
136 spellCheckDialog.DoModal ();
140static LedLineIt_DialogSupport sLedLineIt_DialogSupport;
142inline IncrementalFontSpecification::FontSize FontCmdToSize (UINT cmd)
145 case kFontSize9CmdID:
147 case kFontSize10CmdID:
149 case kFontSize12CmdID:
151 case kFontSize14CmdID:
153 case kFontSize18CmdID:
155 case kFontSize24CmdID:
157 case kFontSize36CmdID:
159 case kFontSize48CmdID:
161 case kFontSize72CmdID:
163 case kFontSizeOtherCmdID:
165 case kFontSizeSmallerCmdID:
167 case kFontSizeLargerCmdID:
174inline bool IsPredefinedFontSize (
int size)
200inline bool IsASCIISpace (
int c)
202 return isascii (c) and isspace (c);
206const unsigned int kCharsPerTab = 4;
208const DistanceType kBadDistance = DistanceType (-1);
210class GotoLineDialog :
public CDialog {
212 GotoLineDialog (
size_t origLine)
213 : CDialog (kGotoLine_DialogID)
214 , fOrigLine (origLine)
218 virtual BOOL OnInitDialog ()
override
220 BOOL result = CDialog::OnInitDialog ();
221 SetDlgItemInt (kGotoLine_Dialog_LineNumberEditFieldID,
static_cast<UINT
> (fOrigLine));
224 virtual void OnOK ()
override
227 fResultLine = GetDlgItemInt (kGotoLine_Dialog_LineNumberEditFieldID, &trans);
239 DECLARE_MESSAGE_MAP ()
241BEGIN_MESSAGE_MAP (GotoLineDialog, CDialog)
244#if qSupportGenRandomCombosCommand
249 ::srand ((
unsigned)::time (NULL));
260IMPLEMENT_DYNCREATE (LedLineItView, CView)
262DISABLE_COMPILER_MSC_WARNING_START (4407)
263BEGIN_MESSAGE_MAP (LedLineItView, LedLineItView::inherited)
267ON_COMMAND (ID_CANCEL_EDIT_CNTR, OnCancelEditCntr)
268ON_COMMAND (ID_CANCEL_EDIT_SRVR, OnCancelEditSrvr)
269ON_COMMAND (ID_FILE_PRINT, OnFilePrint)
270ON_COMMAND (ID_FILE_PRINT_DIRECT, OnFilePrint)
271ON_COMMAND (ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
273ON_COMMAND (kGotoLineCmdID, OnGotoLineCommand)
274#if qSupportGenRandomCombosCommand
275ON_COMMAND (kGenRandomCombosCmdID, OnGenRandomCombosCommand)
277ON_COMMAND (kShiftLeftCmdID, OnShiftLeftCommand)
278ON_COMMAND (kShiftRightCmdID, OnShiftRightCommand)
280ON_COMMAND (cmdChooseFontDialog, OnChooseFontCommand)
282ON_UPDATE_COMMAND_UI_RANGE (cmdFontMenuFirst, cmdFontMenuLast, OnUpdateFontNameChangeCommand)
283ON_COMMAND_RANGE (cmdFontMenuFirst, cmdFontMenuLast, OnFontNameChangeCommand)
285ON_UPDATE_COMMAND_UI_RANGE (kBaseFontSizeCmdID, kLastFontSizeCmdID, OnUpdateFontSizeChangeCommand)
286ON_COMMAND_RANGE (kBaseFontSizeCmdID, kLastFontSizeCmdID, OnFontSizeChangeCommand)
288DISABLE_COMPILER_MSC_WARNING_END (4407)
290LedLineItView::LedLineItView ()
292 , fTabStopList (TWIPS (1440 / 3))
293 , fCachedLayoutWidth (kBadDistance)
294#if qSupportSyntaxColoring
295 , fSyntaxColoringMarkerOwner (NULL)
298 SetDefaultFont (Options{}.GetDefaultNewDocFont ());
300 SetSmartCutAndPasteMode (Options{}.GetSmartCutAndPaste ());
301 SetControlArrowsScroll (
true);
302 SetScrollBarType (h, eScrollBarAlways);
303 SetScrollBarType (v, eScrollBarAlways);
309 const TWIPS kLedItViewTopMargin = TWIPS (60);
310 const TWIPS kLedItViewBottomMargin = TWIPS (0);
311 const TWIPS kLedItViewLHSMargin = TWIPS (60);
312 const TWIPS kLedItViewRHSMargin = TWIPS (60);
313#if qStroika_Foundation_Common_Platform_Windows
315 SetDefaultWindowMargins (TWIPS_Rect (kLedItViewTopMargin, kLedItViewLHSMargin, kLedItViewBottomMargin - kLedItViewTopMargin,
316 kLedItViewRHSMargin - kLedItViewLHSMargin));
319#if qStroika_Foundation_Common_Platform_MacOS || qStroika_Foundation_Common_Platform_Windows
320 SetUseSecondaryHilight (
true);
324LedLineItView::~LedLineItView ()
326 SpecifyTextStore (NULL);
327 SetCommandHandler (NULL);
328#if qIncludeBasicSpellcheckEngine
329 SetSpellCheckEngine (NULL);
331#if qSupportSyntaxColoring
332 Assert (fSyntaxColoringMarkerOwner == NULL);
336void LedLineItView::OnInitialUpdate ()
338 inherited::OnInitialUpdate ();
339 SpecifyTextStore (&GetDocument ().GetTextStore ());
340 SetCommandHandler (&GetDocument ().GetCommandHandler ());
341#if qIncludeBasicSpellcheckEngine
342 SetSpellCheckEngine (LedLineItApplication::Get ().fSpellCheckEngine.get ());
346#if qSupportSyntaxColoring
347void LedLineItView::ResetSyntaxColoringTable ()
349 if (PeekAtTextStore () != NULL) {
351 static const TableDrivenKeywordSyntaxAnalyzer kCPlusPlusAnalyzer (TableDrivenKeywordSyntaxAnalyzer::kCPlusPlusKeywords);
352 static const TableDrivenKeywordSyntaxAnalyzer kVisualBasicAnalyzer (TableDrivenKeywordSyntaxAnalyzer::kVisualBasicKeywords);
354 const SyntaxAnalyzer* analyzer = NULL;
355 switch (Options{}.GetSyntaxColoringOption ()) {
356 case Options::eSyntaxColoringNone:
358 case Options::eSyntaxColoringCPlusPlus:
359 analyzer = &kCPlusPlusAnalyzer;
361 case Options::eSyntaxColoringVB:
362 analyzer = &kVisualBasicAnalyzer;
366 delete fSyntaxColoringMarkerOwner;
367 fSyntaxColoringMarkerOwner = NULL;
369 if (analyzer != NULL) {
370#if qSupportOnlyMarkersWhichOverlapVisibleRegion
371 fSyntaxColoringMarkerOwner =
new WindowedSyntaxColoringMarkerOwner (*
this, GetTextStore (), *analyzer);
373 fSyntaxColoringMarkerOwner =
new SimpleSyntaxColoringMarkerOwner (*
this, GetTextStore (), *analyzer);
375 fSyntaxColoringMarkerOwner->RecheckAll ();
380void LedLineItView::HookLosingTextStore ()
382 delete fSyntaxColoringMarkerOwner;
383 fSyntaxColoringMarkerOwner = NULL;
384 inherited::HookLosingTextStore ();
387void LedLineItView::HookGainedNewTextStore ()
389 Assert (fSyntaxColoringMarkerOwner == NULL);
390 inherited::HookGainedNewTextStore ();
391 ResetSyntaxColoringTable ();
395#if qSupportSyntaxColoring
396vector<StyleRunElement> LedLineItView::SummarizeStyleMarkers (
size_t from,
size_t to)
const
399 StyleMarkerSummarySinkForSingleOwner summary (*fSyntaxColoringMarkerOwner, from, to);
400 GetTextStore ().CollectAllMarkersInRangeInto (from, to, TextStore::kAnyMarkerOwner, summary);
401 return summary.ProduceOutputSummary ();
404vector<StyleRunElement> LedLineItView::SummarizeStyleMarkers (
size_t from,
size_t to,
const TextLayoutBlock& text)
const
406 StyleMarkerSummarySinkForSingleOwner summary (*fSyntaxColoringMarkerOwner, from, to, text);
407 GetTextStore ().CollectAllMarkersInRangeInto (from, to, TextStore::kAnyMarkerOwner, summary);
408 return summary.ProduceOutputSummary ();
412size_t LedLineItView::GetCurUserLine ()
const
417 return GetRowContainingPosition (GetSelectionStart ()) + 1;
420void LedLineItView::SetCurUserLine (
size_t newCurLine)
425 if (newCurLine >= 1) {
426 if (newCurLine > GetRowCount ()) {
427 newCurLine = GetRowCount ();
429 selPos = GetStartOfRow (newCurLine + (0 - 1));
431 size_t endPos = min (GetRealEndOfRowContainingPosition (selPos), GetLength ());
432 SetSelection (selPos, endPos);
433 ScrollToSelection ();
436const TabStopList& LedLineItView::GetTabStopList (
size_t )
const
441void LedLineItView::TabletChangedMetrics ()
443 inherited::TabletChangedMetrics ();
445 Tablet_Acquirer tablet_ (
this);
446 Tablet* tablet = tablet_;
447 fTabStopList.fTWIPSPerTabStop = tablet->CvtToTWIPSH (kCharsPerTab * GetFontMetricsAt (0).GetMaxCharacterWidth ());
448 fCachedLayoutWidth = kBadDistance;
449#if qSupportSyntaxColoring
450 if (fSyntaxColoringMarkerOwner != NULL) {
451 fSyntaxColoringMarkerOwner->RecheckAll ();
456void LedLineItView::DidUpdateText (
const UpdateInfo& updateInfo)
noexcept
458 inherited::DidUpdateText (updateInfo);
459 fCachedLayoutWidth = kBadDistance;
462void LedLineItView::UpdateScrollBars ()
465 fCachedLayoutWidth = kBadDistance;
466 inherited::UpdateScrollBars ();
467#if qSupportSyntaxColoring && qSupportOnlyMarkersWhichOverlapVisibleRegion
468 if (fSyntaxColoringMarkerOwner != NULL) {
469 fSyntaxColoringMarkerOwner->RecheckScrolling ();
474DistanceType LedLineItView::ComputeMaxHScrollPos ()
const
476 if (fCachedLayoutWidth == kBadDistance) {
483 DistanceType width = CalculateLongestRowInWindowPixelWidth ();
484 if (GetHScrollPos () != 0) {
485 width = max (width, GetHScrollPos () + GetWindowRect ().GetWidth ());
487 fCachedLayoutWidth = max (width, DistanceType (1));
489 DistanceType wWidth = GetWindowRect ().GetWidth ();
490 if (fCachedLayoutWidth > wWidth) {
491 return (fCachedLayoutWidth - wWidth);
498void LedLineItView::OnTypedNormalCharacter (Led_tChar theChar,
bool optionPressed,
bool shiftPressed,
bool commandPressed,
499 bool controlPressed,
bool altKeyPressed)
501 if (theChar ==
'\t' and Options{}.GetTreatTabAsIndentChar ()) {
503 bool shiftSituation = GetSelectionStart () != GetSelectionEnd ();
504 if (shiftSituation) {
507 size_t selStart = GetSelectionStart ();
508 size_t selEnd = GetSelectionEnd ();
509 size_t selStartRowStart = GetStartOfRowContainingPosition (selStart);
510 size_t selEndRowStart = GetStartOfRowContainingPosition (selEnd);
511 size_t selEndRowEnd = GetEndOfRowContainingPosition (selEnd);
514 if (selStartRowStart != selEndRowStart) {
517 else if (selStartRowStart == selEndRowStart and selStart == selStartRowStart and selEnd == selEndRowEnd) {
522 shiftSituation =
false;
526 if (shiftSituation) {
528 OnShiftLeftCommand ();
531 OnShiftRightCommand ();
537 inherited::OnTypedNormalCharacter (theChar, optionPressed, shiftPressed, commandPressed, controlPressed, altKeyPressed);
538 if (theChar ==
'\n' and GetSelectionStart () == GetSelectionEnd () and Options{}.GetAutoIndent ()) {
540 size_t rowStart = GetStartOfRowContainingPosition (GetSelectionEnd ());
541 size_t prevRowStart = GetStartOfPrevRowFromRowContainingPosition (GetSelectionEnd ());
543 if (rowStart != prevRowStart) {
544 size_t prevRowEnd = GetEndOfRowContainingPosition (prevRowStart);
545 Assert (prevRowEnd >= prevRowStart);
546 size_t prevRowLen = prevRowEnd - prevRowStart;
547 StackBuffer<Led_tChar> buf{Memory::eUninitialized, prevRowLen};
548 CopyOut (prevRowStart, prevRowLen, buf.data ());
550 for (
size_t i = 0; i < prevRowLen; ++i) {
552 if (not IsASCIISpace (buf[i])) {
557 InteractiveReplace (buf.data (), nTChars);
562void LedLineItView::OnContextMenu (CWnd* , CPoint pt)
565 if (menu.LoadMenu (kContextMenu)) {
566 CMenu* popup = menu.GetSubMenu (0);
568 popup->TrackPopupMenu (TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, ::AfxGetMainWnd ());
572BOOL LedLineItView::IsSelected (
const CObject* pDocItem)
const
580 [[maybe_unused]] BOOL test = inherited::IsSelected (pDocItem);
584void LedLineItView::OnUpdateFontNameChangeCommand (CCmdUI* pCmdUI)
590 SDKString fontName = CmdNumToFontName (pCmdUI->m_nID);
592 pCmdUI->SetCheck (fontName == GetDefaultFont ().GetFontName ());
593 pCmdUI->Enable (
true);
596void LedLineItView::OnFontNameChangeCommand (UINT cmdNum)
598 SDKString fontName = CmdNumToFontName (cmdNum);
599 IncrementalFontSpecification applyFontSpec;
600 applyFontSpec.SetFontName (fontName);
601 SetDefaultFont (applyFontSpec);
604void LedLineItView::OnUpdateFontSizeChangeCommand (CCmdUI* pCmdUI)
607 int chosenFontSize = FontCmdToSize (pCmdUI->m_nID);
609 if (chosenFontSize == 0) {
610 switch (pCmdUI->m_nID) {
611 case kFontSizeSmallerCmdID:
612 case kFontSizeLargerCmdID: {
613 pCmdUI->Enable (
true);
616 case kFontSizeOtherCmdID: {
618 Characters::CString::Copy (nameBuf, Memory::NEltsOf (nameBuf), _T (
"Other"));
619 pCmdUI->SetCheck (
false);
621 int pointSize = GetDefaultFont ().GetPointSize ();
622 if (not IsPredefinedFontSize (pointSize)) {
623 Characters::CString::Cat (nameBuf, Memory::NEltsOf (nameBuf), _T (
" ("));
625 DISABLE_COMPILER_MSC_WARNING_START (4996)
626 _stprintf (nBuf, _T ("%d"), GetDefaultFont ().GetPointSize ());
627 DISABLE_COMPILER_MSC_WARNING_END (4996)
628 Characters::CString::Cat (nameBuf, Memory::NEltsOf (nameBuf), nBuf);
629 Characters::CString::Cat (nameBuf, Memory::NEltsOf (nameBuf), _T (")"));
630 pCmdUI->SetCheck (true);
633 Characters::CString::Cat (nameBuf, Memory::NEltsOf (nameBuf), _T ("..."));
634 pCmdUI->SetText (nameBuf);
639 pCmdUI->SetCheck (GetDefaultFont ().GetPointSize () == chosenFontSize);
640 pCmdUI->Enable (
true);
644void LedLineItView::OnFontSizeChangeCommand (UINT cmdNum)
646 FontSpecification::FontSize chosenFontSize = FontCmdToSize (cmdNum);
647 if (chosenFontSize == 0) {
649 case kFontSizeSmallerCmdID: {
650 IncrementalFontSpecification applyFontSpec;
651 applyFontSpec.SetPointSizeIncrement (-1);
652 SetDefaultFont (applyFontSpec);
655 case kFontSizeLargerCmdID: {
656 IncrementalFontSpecification applyFontSpec;
657 applyFontSpec.SetPointSizeIncrement (1);
658 SetDefaultFont (applyFontSpec);
661 case kFontSizeOtherCmdID: {
662 DistanceType oldSize = GetDefaultFont ().GetPointSize ();
663 chosenFontSize =
static_cast<FontSpecification::FontSize
> (PickOtherFontHeight (oldSize));
667 if (chosenFontSize != 0) {
668 IncrementalFontSpecification applyFontSpec;
669 applyFontSpec.SetPointSize (chosenFontSize);
670 SetDefaultFont (applyFontSpec);
674DistanceType LedLineItView::PickOtherFontHeight (DistanceType origHeight)
676#if qStroika_Foundation_Common_Platform_MacOS
677 Led_StdDialogHelper_OtherFontSizeDialog dlg;
678#elif qStroika_Foundation_Common_Platform_Windows
679 Led_StdDialogHelper_OtherFontSizeDialog dlg{::AfxGetResourceHandle (), ::GetActiveWindow ()};
681 dlg.InitValues (origHeight);
682 if (dlg.DoModal ()) {
683 return dlg.fFontSize_Result;
690LedLineItView::SearchParameters LedLineItView::GetSearchParameters ()
const
692 return Options{}.GetSearchParameters ();
695void LedLineItView::SetSearchParameters (
const SearchParameters& sp)
697 Options{}.SetSearchParameters (sp);
700void LedLineItView::OnGotoLineCommand ()
706 size_t rowNumber = GetCurUserLine ();
714 GotoLineDialog dlg (rowNumber);
716 if (dlg.DoModal () == IDOK) {
717 SetCurUserLine (dlg.fResultLine);
721#if qSupportGenRandomCombosCommand
722void LedLineItView::OnGenRandomCombosCommand ()
724 vector<Led_tString> srcFrags;
727 size_t lastStart =
static_cast<size_t> (-1);
728 for (
size_t i = GetStartOfRowContainingPosition (GetSelectionStart ()); i < GetSelectionEnd () and lastStart != i;
729 lastStart = i, i = GetStartOfNextRowFromRowContainingPosition (i)) {
730 size_t rowEnd = GetEndOfRowContainingPosition (i);
731 size_t rowLen = rowEnd - i;
732 StackBuffer<Led_tChar> buf{Memory::eUninitialized, rowLen + 1};
733 CopyOut (i, rowLen, buf);
735 srcFrags.push_back (
static_cast<Led_tString
> (buf));
739 const unsigned kGeneratedCount = 100;
740 const unsigned kMaxComboLen = 4;
741 set<Led_tString> resultFrags;
742 if (srcFrags.size () != 0) {
743 for (
size_t i = 0; i < kGeneratedCount; ++i) {
744 unsigned int n = (rand () % kMaxComboLen) + 1;
746 for (
size_t ni = 0; ni < n; ++ni) {
748 unsigned int wi = (rand () % srcFrags.size ());
749 tmpWord += srcFrags[wi];
751 resultFrags.insert (tmpWord);
755 CDocManager* docMgr = AfxGetApp ()->m_pDocManager;
757 CDocTemplate* pTemplate = NULL;
759 POSITION p = docMgr->GetFirstDocTemplatePosition ();
760 pTemplate = docMgr->GetNextDocTemplate (p);
763 CDocument* newDoc = pTemplate->OpenDocumentFile (NULL);
764 newDoc->SetTitle (newDoc->GetTitle () + Led_SDK_TCHAROF (
" {generated-words}"));
765 LedLineItDocument* lNewDoc =
dynamic_cast<LedLineItDocument*
> (newDoc);
767 TextStore& ts = lNewDoc->GetTextStore ();
768 for (set<Led_tString>::const_iterator i = resultFrags.begin (); i != resultFrags.end (); ++i) {
769 ts.Replace (ts.GetEnd (), ts.GetEnd (), (*i).c_str (), (*i).length ());
770 ts.Replace (ts.GetEnd (), ts.GetEnd (), LED_TCHAR_OF (
"\n"), 1);
775void LedLineItView::OnShiftLeftCommand ()
777 OnShiftNCommand (
false);
780void LedLineItView::OnShiftRightCommand ()
782 OnShiftNCommand (
true);
785void LedLineItView::OnShiftNCommand (
bool shiftRight)
787 BreakInGroupedCommands ();
790 PartitionMarker* firstPM = GetPartitionMarkerContainingPosition (GetSelectionStart ());
791 PartitionMarker* lastPM = GetPartitionMarkerContainingPosition (GetSelectionEnd ());
794 if (lastPM != firstPM and lastPM->GetStart () == GetSelectionEnd ()) {
795 lastPM = lastPM->GetPrevious ();
799 TextInteractor::UndoableContextHelper undoContext (*
this, shiftRight ? Led_SDK_TCHAROF (
"Shift Right") : Led_SDK_TCHAROF (
"Shift Left"),
800 firstPM->GetStart (), min (lastPM->GetEnd (), GetTextStore ().GetEnd ()),
801 GetSelectionStart (), GetSelectionEnd (), false);
803 SetSelection (firstPM->GetStart (), min (lastPM->GetEnd (), GetTextStore ().GetEnd ()));
806 for (PartitionMarker* pm = firstPM; pm != lastPM->GetNext (); pm = pm->GetNext ()) {
808 InteractiveReplace_ (pm->GetStart (), pm->GetStart (), LED_TCHAR_OF (
"\t"), 1,
false,
false, eDefaultUpdate);
811 size_t pmLength = pm->GetLength ();
812 size_t lookAtLength = min<size_t> (pmLength - 1, kCharsPerTab);
813 StackBuffer<Led_tChar> buf{Memory::eUninitialized, lookAtLength};
814 CopyOut (pm->GetStart (), lookAtLength, buf.data ());
815 size_t deleteLength = lookAtLength;
816 for (
size_t i = 0; i < lookAtLength; ++i) {
817 if (buf[i] ==
'\t') {
818 deleteLength = i + 1;
821 if (not(IsASCIISpace (buf[i]))) {
828 InteractiveReplace_ (pm->GetStart (), pm->GetStart () + deleteLength, LED_TCHAR_OF (
""), 0,
false,
false, eDefaultUpdate);
833 SetSelection (firstPM->GetStart (), min (lastPM->GetEnd (), GetTextStore ().GetEnd ()));
835 undoContext.CommandComplete ();
837 BreakInGroupedCommands ();
843void LedLineItView::OnCancelEditCntr ()
846 COleClientItem* pActiveItem = GetDocument ().GetInPlaceActiveItem (
this);
847 if (pActiveItem != NULL) {
848 pActiveItem->Close ();
850 ASSERT (GetDocument ().GetInPlaceActiveItem (
this) == NULL);
855void LedLineItView::OnSetFocus (CWnd* pOldWnd)
857 COleClientItem* pActiveItem = GetDocument ().GetInPlaceActiveItem (
this);
858 if (pActiveItem != NULL && pActiveItem->GetItemState () == COleClientItem::activeUIState) {
860 CWnd* pWnd = pActiveItem->GetInPlaceWindow ();
866 inherited::OnSetFocus (pOldWnd);
869void LedLineItView::OnCancelEditSrvr ()
871 GetDocument ().OnDeactivateUI (FALSE);
874void LedLineItView::OnSelectAllCommand ()
876 SetSelection (0, GetLength ());
879void LedLineItView::OnChooseFontCommand ()
883 (void)::memset (&lf, 0,
sizeof (lf));
885 Characters::CString::Copy (lf.lfFaceName, Memory::NEltsOf (lf.lfFaceName), GetDefaultFont ().GetFontNameSpecifier ().fName);
886 Assert (::_tcslen (lf.lfFaceName) < sizeof (lf.lfFaceName));
888 lf.lfWeight = (GetDefaultFont ().GetStyle_Bold ()) ? FW_BOLD : FW_NORMAL;
889 lf.lfItalic = (GetDefaultFont ().GetStyle_Italic ());
890 lf.lfUnderline = (GetDefaultFont ().GetStyle_Underline ());
891 lf.lfStrikeOut = (GetDefaultFont ().GetStyle_Strikeout ());
893 lf.lfHeight = GetDefaultFont ().PeekAtTMHeight ();
895 FontDlgWithNoColorNoStyles dlog (&lf);
896 if (dlog.DoModal () == IDOK) {
902void LedLineItView::AssertValid ()
const
904 inherited::AssertValid ();
907void LedLineItView::Dump (CDumpContext& dc)
const
909 inherited::Dump (dc);
912LedLineItDocument& LedLineItView::GetDocument () const
914 ASSERT (m_pDocument->IsKindOf (RUNTIME_CLASS (LedLineItDocument)));
915 ASSERT_VALID (m_pDocument);
916 return *(LedLineItDocument*)m_pDocument;
925FontDlgWithNoColorNoStyles::FontDlgWithNoColorNoStyles (LOGFONT* lf)
926 : CFontDialog (lf, CF_SCREENFONTS | CF_SCALABLEONLY | CF_NOVERTFONTS)
931BOOL FontDlgWithNoColorNoStyles::OnInitDialog ()
933 BOOL result = CFontDialog::OnInitDialog ();
939 if (GetDlgItem (stc2) != NULL) {
940 GetDlgItem (stc2)->ShowWindow (SW_HIDE);
943 if (GetDlgItem (cmb2) != NULL) {
944 GetDlgItem (cmb2)->ShowWindow (SW_HIDE);
948 if (GetDlgItem (stc7) != NULL) {
949 GetDlgItem (stc7)->ShowWindow (SW_HIDE);
952 if (GetDlgItem (cmb5) != NULL) {
953 GetDlgItem (cmb5)->ShowWindow (SW_HIDE);
#define RequireNotNull(p)
Logically halfway between std::array and std::vector; Smart 'direct memory array' - which when needed...
basic_string< SDKChar > SDKString