//--------------------------------------------------------------------------- #include #pragma hdrstop #include "swdisprtf.h" #include //--------------------------------------------------------------------------- __fastcall SWDispRTF::SWDispRTF(TWinControl *Owner) : TRxRichEditX(Owner) { RTFStream = new TMemoryStream(); ExpandNewLine = true; this->AutoURLDetect = true; } __fastcall SWDispRTF::~SWDispRTF() { if (RTFStream) delete RTFStream; } void __fastcall SWDispRTF::Loaded(void) { TRxRichEditX::Loaded(); } int __fastcall SWDispRTF::GetMySelStart() { CHARRANGE cr; SendMessage(Handle, EM_EXGETSEL, 0, (long)&cr); return cr.cpMin; } void __fastcall SWDispRTF::SetMySelStart(int iselstart) { CHARRANGE cr; cr.cpMin = iselstart; cr.cpMax = iselstart; SendMessage(Handle, EM_EXSETSEL, 0, (long)&cr); } // Display for Comm and LD char SWDispRTF::Display(SWModule &Module) { System::AnsiString newtext, tmptext; static UnicodeRTF filter; char buf[255]; module = &Module; type = "Default"; recalcAppearance(); newtext = RTFHeader; newtext = newtext + RTFHeadMargin; Module.Error(); // clear error; newtext = newtext + "\\pard \\nowidctlpar \\cf7\\f0 "; (const char *)Module; // force key to snap to entry before pulling out the text of the key strcpy(buf, Module.KeyText()); SWKey *key = Module; // VerseKey locales are not yet UTF8, so don't try to convert them. if (!SWDYNAMIC_CAST(VerseKey, key)) filter.ProcessText(buf, 253, Module, &Module); newtext = newtext + RTFHeadingPre + buf + RTFHeadingPost + ":{\\par}"; tmptext = ""; tmptext = (const char *)Module; newtext = newtext + RTFVersePre + tmptext + RTFVersePost; newtext = newtext + RTFTrailer; RTFStream->Clear(); RTFStream->WriteBuffer(newtext.c_str(), newtext.Length()); RTFStream->Position = 0; Lines->LoadFromStream(RTFStream); // make links while (true) { int start, len, foundAt, endAt; start = (SelLength) ? SelStart + SelLength : 0; len = Text.Length() - start; foundAt = this->SearchText("", start, len, TRichSearchTypes()); if (foundAt == -1) break; SelStart = foundAt; SelLength = 11; this->SelText = ""; endAt = this->SearchText("", foundAt, len, TRichSearchTypes()); if (foundAt == -1) break; SelStart = endAt; SelLength = 4; this->SelText = ""; SelStart = foundAt; SelLength = endAt - foundAt; this->SelAttributes->Link = true; } //{ Position control text at current verse } this->SetFocus(); SelStart = 0; SelLength = 0; SendMessage(Handle, EM_SCROLLCARET, 0, 0); return 0; } //---------------------------------------------------------------------------